首页 > 其他 > 详细

【树】450. 删除二叉搜索树中的节点

时间:2020-05-03 12:41:36      阅读:34      评论:0      收藏:0      [点我收藏+]

题目:

技术分享图片

 

 

解法:

二叉搜索树的三个特性:

这些性质最好在面试之前了解清楚:

  • 二叉搜索树的中序遍历的序列是递增排序的序列。中序遍历的遍历次序:left->Node->right。
  • Successor代表的是中序遍历序列的下一个节点。即比当前节点大的最小节点,简称后继节点。先取当前节点的右节点,然后一直取该节点的左节点,直到左节点为空,则最后指向的节点为后继节点。
  • Predecessor代表的是中序遍历的前一个节点。即比当前节点小的最大节点,简称前驱节点。先取当前节点的左节点,然后取该节点的右节点,直到右节点为空,则最后指向的节点为前驱节点。

算法:

(1)如果 key > root.val,说明要删除的节点在右子树,root.right = deleteNode(root.right, key)。

(2)如果 key < root.val,说明要删除的节点在左子树,root.left = deleteNode(root.left, key)。

(3)如果 key == root.val,则该节点就是我们要删除的节点,则:

  A. 如果该节点是叶子节点,则直接删除它:root = null。

  B. 如果该节点不是叶子节点且有右节点,则用它的后继节点的值替代 root.val = successor.val,然后删除后继节点。

  C. 如果该节点不是叶子节点且只有左节点,则用它的前驱节点的值替代 root.val = predecessor.val,然后删除前驱节点。

(4)返回 root。

技术分享图片

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12 
13     /*
14         One step right and then always left
15     */
16     int successor(TreeNode *root) 
17     {
18         root = root->right;
19         while (root->left != NULL) 
20         {
21             root = root->left;            
22         }
23     
24         return root->val;
25     }
26 
27     /*
28         One step left and then always right
29     */
30     int predecessor(TreeNode *root) 
31     {
32         root = root->left;
33         while (root->right != NULL) 
34         {
35             root = root->right;
36         }
37         return root->val;
38     }
39 
40     TreeNode* deleteNode(TreeNode *root, int key) 
41     {
42         if (root == NULL) 
43         {
44             return NULL;
45         }
46 
47         // delete from the right subtree
48         if (key > root->val) 
49         {
50             root->right = deleteNode(root->right, key);
51         }
52         // delete from the left subtree
53         else if (key < root->val) 
54         {
55             root->left = deleteNode(root->left, key);
56         }
57         // delete the current node
58         else 
59         {
60             // the node is a leaf
61             if (root->left == NULL && root->right == NULL) 
62             {
63                 root = NULL;
64             }
65             // the node is not a leaf and has a right child
66             else if (root->right != NULL) 
67             {
68                 root->val = successor(root);
69                 root->right = deleteNode(root->right, root->val);
70             }
71             // the node is not a leaf, has no right child, and has a left child    
72             else 
73             {
74                 root->val = predecessor(root);
75                 root->left = deleteNode(root->left, root->val);
76             }
77         }
78         return root;
79     }
80 };

 

【树】450. 删除二叉搜索树中的节点

原文:https://www.cnblogs.com/ocpc/p/12821477.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!