昨天在看書的時候,突然看到二叉查詢樹的刪除,以前學過,不過學的不仔細,結果研究了一晚上,才把二叉樹的刪除操作給整出來。
唉,以後看書要仔細啊。。。。。
先說一下如何刪除二叉樹查詢樹的節點吧。總共有三種情況
1.被刪除的節點是葉子節點,這時候只要把這個節點刪除,再把指向這個節點的父節點指標置為空就行
2.被刪除的節點有左子樹,或者有右子樹,而且只有其中乙個,那麼只要把當前刪除節點的父節點指向被刪除節點的左子樹或者右子樹就行。
3.被刪除的節點既有左子樹而且又有右子樹,這時候需要把左子樹的最右邊的節點或者右子樹最左邊的節點提到被刪除節點的位置,為什麼要這樣呢,根據二叉查詢樹的性質,父節點的指標一定比所有左子樹的節點值大而且比右子樹的節點的值小,為了刪除父節點不破壞二叉查詢樹的平衡性,應當把左子樹最大的節點或者右子樹最小的節點放在父節點的位置,這樣的話才能維護二叉查詢樹的平衡性。(我是找的右子樹的最小節點)
#include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long
#define inf 0x3f3f3f3f
using namespace std;
struct node
;typedef node * pnode;
void add(pnode & it,int i)
else
else
}else
else}}
}}void show(pnode it)
if (x->right!=nullptr)
}}void delete(pnode & it,int val)
else
}if (j==nullptr)
else//如果刪除的節點不是根節點,把指向刪除節點的指標置空
else
delete j;}}
else if (j->left==nullptr||j->right==nullptr)//左子樹不為空或者右子樹不為空
else
else
}delete j;
}else
else
else
}delete j;}}
/*看清楚這時候的刪除操作,刪除的不是j節點了,
刪除的是把值賦給j節點的節點,
因為這時候這個節點已經被提到父節點的位置*/
else if (j->left!=nullptr&&j->right!=nullptr)//
j->value=p->value;
if (j==pp)
else
delete p;
}}int main()
cout<<"刪除節點3"<
二叉樹節點的刪除
昨天在看書的時候,突然看到二叉查詢樹的刪除,以前學過,不過學的不仔細,結果研究了一晚上,才把二叉樹的刪除操作給整出來。唉,以後看書要仔細啊。先說一下如何刪除二叉樹查詢樹的節點吧。總共有三種情況 1.被刪除的節點是葉子節點,這時候只要把這個節點刪除,再把指向這個節點的父節點指標置為空就行 2.被刪除的...
二叉樹節點的插入與刪除
1 先定義乙個二叉樹節點 templateclass treenode treenode t ele 2 再進行二叉樹的插入以建立乙個二叉樹 若二叉樹為空,直接建立根節點儲存資料即可 若不為空,當新元素小於父節點時,根據二叉搜尋樹特點,需要作為父節點左子樹,反之作為右子樹 bool insert t...
列印二叉樹節點
從上往下列印出二叉樹的每個節點,同層節點從左至右列印。條件反射地想通過遞迴解決,結果硬是沒有找到合適的解決思路,也許遞迴的方式不是很適合這種型別的題目吧 利用佇列的先進先出 fifo 特性解決。每從佇列頭部獲取乙個節點,就將該節點的左右子節點存入佇列的尾部。如此往復,直至隊列為空。這篇部落格內的和 ...