新手学习算法----二叉树(二叉线索查找树中序后继)
题目:给定一个位于二叉查找树中的节点,找出其中序后继。
定义:
前驱节点
- 若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点
- 若一个节点没有左子树,那么判断该节点和其父节点的关系
2.1 若该节点是其父节点的右边孩子,那么该节点的前驱结点即为其父节点。
2.2 若该节点是其父节点的左边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的右边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点
类似,我么可以得到求后继节点的规则。
后继节点
- 若一个节点有右子树,那么该节点的后继节点是其右子树中val值最小的节点
- 若一个节点没有右子树,那么判断该节点和其父节点的关系
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就是该节点的后继节点 } } }