新手学习算法----二叉树(二叉线索查找树中序后继)

题目:给定一个位于二叉查找树中的节点,找出其中序后继。

定义:

前驱节点

  1. 若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点
  2. 若一个节点没有左子树,那么判断该节点和其父节点的关系 
    2.1 若该节点是其父节点的右边孩子,那么该节点的前驱结点即为其父节点。 
    2.2 若该节点是其父节点的左边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的右边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点

类似,我么可以得到求后继节点的规则。

后继节点

    1. 若一个节点有右子树,那么该节点的后继节点是其右子树中val值最小的节点
    2. 若一个节点没有右子树,那么判断该节点和其父节点的关系 
      2.1 若该节点是其父节点的左边孩子,那么该节点的后继结点即为其父节点 
      2.2 若该节点是其父节点的右边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的左边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点

                                                         

                               例如: 节点5在后序遍历的后序节点就是6,沿着其节点5的父节点往上找到第一个节点P为其父节点Q的左孩子,则Q即为节点5的后序

  

 Java代码:

public class solution 
{
    /*如果节点有右子树的话,其后序就是其子树中val值最小的节点
    如果没有有右子树,就要分开讨论了,一共有三种情况*/
    public TreeNode Action(TreeNode root, TreeNode p){
        if(root == null&&p==null){
            return null;
        }
        if(root.val<= p.val){  //如果目标值大于根节点值说明P的后序节点为root根的右子树,则往右子树找
            Action(root.right,p);
        }else{
            TreeNode left = Action(root.left,p);//else的作用是找到第一个大于p的值即为p的后序节点
            return(left!= null)?left:root;// 若该节点是其父节点的左边孩子,那么该节点的后继结点即为其父节点 
//若该节点是其父节点的右边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的左边孩子,那么Q就是该节点的后继节点
        }
    }
}

 

posted @ 2017-07-25 15:35  JunLiu37  阅读(431)  评论(0编辑  收藏  举报