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