値が x であるノードのサブツリーを削除します
トピック
二分木が二分連結リストに格納されていることがわかっており、アルゴリズムが完成しました。木の要素値が x である各ノードについて、それをルートとする部分木を削除し、対応するスペースを解放します。
アイディア
- 要素値 x をルートとするサブツリーを削除するには、その左右のサブツリーを削除できる限り、値 x のルート ノードを解放できるため、ポスト オーダー トラバーサルを使用することをお勧めします。【プレ・ミドル・シーケンシャル】
- **アルゴリズムのアイデア: **値が x のノードを削除すると、その親ノードの左 (右) の子ポインターが空になる必要があり、階層トラバーサルを使用してノードの親ノードを簡単に見つけることができます。この質問では、要素値が × であるノードのサブツリーをツリーで削除する必要があるため、完全なバイナリ ツリーをトラバースする必要があります。【BFS】
コーディング
/**
* 删除当前结点
*
* @param root 根节点
*/
public void removeChildNodes(TreeNode root) {
if (root != null) {
removeChildNodes(root.left);
removeChildNodes(root.right);
//这里我假设val=-1就是无效结点,也就是被删除了
root.val = -1;
}
}
/**
* 搜索结点值为x的元素
*
* @param root 根元素
* @param x 要比对的值
*/
public void searchNodesAndDel(TreeNode root, int x) {
if (root != null) {
if (root.val == x) {
removeChildNodes(root.left);
//root.left = null;
removeChildNodes(root.right);
//root.right = null;
}
searchNodesAndDel(root.left, x);
searchNodesAndDel(root.right, x);
}
}