二叉樹的基本操作(增 刪 改 查) C C

2021-08-20 03:40:52 字數 3592 閱讀 8007

#include #include #include #define maxsize 1024

typedef int telemtype;

typedef struct bstnode

bstnode;

/*建立節點*/

bstnode* creatbstnode(telemtype data)

/*在以為root為根的平衡二叉樹中插入乙個值為x的結點*/

int addbstnodetotree(bstnode* root, const telemtype data)

p = p->right;

}else if ((pnew->data) < (p->data))

p = p->left;

}else

}return 0;

}//找到父節點

bstnode* findfather(bstnode* root, const telemtype key, int& pos)

else if (key < p->data)

else if (p->data < key)

}return null;

}/*刪除節點*/

bstnode* deletebstnode(bstnode* &root, const telemtype key)

switch (pos)

case 1:

case 0:

}//第一種情況,沒有左子樹

if (null == ptr->left)

//第二種情況,沒有右子樹

if (null == ptr->right)

//第三種情況,有左子樹也有右子樹

backfather = ptr; //父節點指向當前節點

next = backfather->left; //設定子節點

while (null != next->right)//找到最接近ptr->data的節點

ptr->data = next->data; //替換資料

//此時 next->right == null

if (backfather->left == next)

else

free(next);

return root;

}/*建立乙個二叉排序樹*/

bstnode* creatbst(telemtype arr, const int n)

else if (p->data > key)

else

return p;

}//獲取樹的深度

int getdepth(bstnode* t)

int ld, rd;

ld = 1 + getdepth(t->left );

rd = 1 + getdepth(t->right);

return (ld > rd) ? ld : rd;

}//按樹狀列印二叉樹

void drawbytree(bstnode *t, int depth)

drawbytree(t->right, depth+1);//列印右子樹,並將層次加1

for (int i = 0; i < depth; i++)//按照遞迴的層次列印空格

printf("%d\n", t->data);//輸出根結點

drawbytree(t->left, depth+1);//列印左子樹,並將層次加1

}//按層次輸出二叉樹的結點

void drawbylevel(bstnode *t)

bstnode *queue[maxsize];

bstnode *p;

int front = -1, rear = -1;

rear++;

queue[rear] = t;

while (front != rear)

if (p->right)

}}/*用遞迴的方式,實現二叉樹的先序遍歷*/

void pre_order(bstnode *t)

/*step 1:訪問根*/

printf("%d ",t->data);

/*step 2:用先序的方式去訪問左子樹*/

pre_order(t->left);

/*step 3:用先序的方式去訪問右子樹*/

pre_order(t->right);

}/*用遞迴的方式,實現二叉樹的中序遍歷*/

void mid_order(bstnode *t)

/*step 1:用中序的方式去訪問左子樹*/

mid_order(t->left);

/*step 2:訪問根*/

printf("%d ",t->data);

/*step 3:用中序的方式去訪問右子樹*/

mid_order(t->right);

}/*用遞迴的方式,實現二叉樹的後序遍歷*/

void post_order(bstnode *t)

/*step 1:用後序的方式去訪問左子樹*/

post_order(t->left);

/*step 2:用後序的方式去訪問右子樹*/

post_order(t->right);

/*step 3:訪問根*/

printf("%d ",t->data);

}//產生n個不重複的隨機數

void createarr(telemtype* num, const int n)

}if (***)

}}//將陣列中的數輸出

void showarr(telemtype* num, const int n)

}printf("\n");

}int main()

// srand(time(null) ); //設定隨機數種子

createarr(num, n);

showarr(num, n);

bstnode *t = creatbst(num, n);

printf("pre_order:\n");

pre_order(t);

// printf("\nmid_order:\n");

// mid_order(t);

// printf("\npost_order:\n");

// post_order(t);

putchar('\n');

// printf("\ndrawbylevel:\n");

// drawbylevel(t);

printf("\ndrawbytree:\n");

drawbytree(t, 0);

printf("----------------------------------\n");

printf("delete:\t");

telemtype key;

scanf("%d", &key);

printf("----------------------------------\n");

t = deletebstnode(t, key);

drawbytree(t, 0);

}}

java二叉樹增刪改查詳解

二叉樹的刪除和修改 建議讀者先看二叉樹的建立,遍歷,插入和查詢 然後找到要插入的結點。找法有三種情況 注意事項 原來刪除結點的左右孩子結點和父結點不用管,只要把該插入結點的值給刪除結點就行了,同時你還要把上去的結點的孩子結點處理一下。以便不影響後續操作。雖然說得有些繞,不過其實也沒什麼東西。就是把插...

二叉樹增刪改查 程式實現

二叉排序樹定義 一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 3 左 右子樹也分別為二叉排序樹 4 沒有鍵值相等的結點。二叉樹刪除節點 二叉排序樹刪除節點的時候為其刪除後還是乙個二叉排...

二叉搜尋樹的增刪改查

二叉搜尋樹 binary search tree 簡稱 bst,是一種特殊形式的二叉樹。二叉搜尋樹的的結構有兩種可能 對於二叉搜尋樹,需要掌握基本的操作 當要查詢目標值的節點時,我們可以根據二叉樹的結點資料值的有序性 左孩子 根結點 右孩子 根據以下思路進行查詢 簡單實現 返回以目標值結點為根結點的...