b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

二叉树搜索树中顺序遍历的前驱节点和后继节点

电脑杂谈  发布时间:2020-05-01 06:19:31  来源:网络整理

用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_二叉树的的非递归遍历_二叉排序树中序遍历

前身节点

前任节点的值小于该节点的值,这是该节点的左子树中的最大值

后续节点

用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_二叉树的的非递归遍历_二叉排序树中序遍历

后继节点的值大于该节点的值,这是该节点的右子树中的最小值

因为二叉搜索树遍历的结果是一棵树的节点上的值的升序,所以一个数字的前任节点的值是一个小于它的数字,并且后继节点小于它的较大节点

用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_二叉树的的非递归遍历_二叉排序树中序遍历

查找前驱节点有以下情况:

(1)此节点有一个左子树,因此该节点的前任节点是其左子树中最大的子树. 例如,10有一个左孩子,而其前任是左孩子中最大的孩子,即8.

(2)节点没有左子树,因此有两种情况: 1.节点是其父节点的右子节点,然后其前任节点是其父节点;例如17的前身是16

用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_二叉树的的非递归遍历_二叉排序树中序遍历

2. 该节点是其父节点的左子节点,因此它必须搜索其祖先,直到发现其祖先是左子节点. 如果找不到,则表示该节点没有前驱节点. 例如,8是左孩子,所以它的前任不是父亲,所以他必须抬头,

它的父亲是他爷爷的正直孩子,所以8的前任应该是他的爷爷7.

查找后继节点具有以下情况:

二叉树的的非递归遍历_二叉排序树中序遍历_用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二

(1)该节点具有一个右子树,则该节点的后继节点是其右子树中最小的. 例如,10具有一个正确的子树,其后继是最小的正确的子树.

(2)此节点没有右子树,因此也必须在其祖先中找到其后继节点,并且有两种情况: 1.该节点是其父节点的左子树二叉排序树中序遍历,然后是其后继节点是他的父亲; 2.该节点是父节点的左子树,

然后查找,直到您发现该节点的祖先是左子节点. 如果找不到它,则该节点没有后继. 例如二叉排序树中序遍历,图中的17是父亲的正确孩子. 向上看,发现父亲也是其祖父的正直子女,并且其祖父没有父母,因此该节点也没有继任者.

具体的Java实现代码如下:

 1 /**
 2      * 找给定节点的后继节点
 3      * @param  node 给定树中的节点
 4      * @return  返回该节点存在中序遍历顺序下的后继节点,有则返回后继节点,无则返回null
 5      *
 6      */
 7     public TreeNode successor(TreeNode node){
 8         if(node==null){ return null;}
 9         //若该节点的右子树不为空,则后继节点就是右子树中的最小关键字节点
10         if(node.rightChild!=null){
11             try {
12                 return  minElemNode(node.rightChild);
13             } catch (Exception e) {
14                 e.printStackTrace();
15             }
16         }
17         //若该节点右子树为空
18         TreeNode parentNode=node.parent;
19         while(parentNode !=null && node==parentNode.rightChild){
20             node=parentNode;
21             parentNode=parentNode.parent;
22         }
23         return parentNode;
24     }
25 
26     /**
27      *  找出给定节点的后继节点
28      * @param node 给定节点
29      * @return  后继节点
30      */
31     public  TreeNode precessor(TreeNode node) throws Exception {
32         if(node==null){ return null;}
33         //若该节点有左子树,则前驱节点就是左子树中最大的那个
34         if(node.leftChild!=null){return maxElemNode(node.leftChild);}
35         //若该节点没有左子树
36         TreeNode parentNode=node.parent;
37         if(parentNode!=null&&node==parentNode.leftChild){
38             node=parentNode;
39             parentNode=parentNode.parent;
40         }
41         return  parentNode;
42     }

原始来源:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-194959-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 李玉朋
        李玉朋

        要开通的吧

      • 邹法胜
        邹法胜

        说明到了马云时代的一个转折点

      热点图片
      拼命载入中...