面试题58:二叉树的下一个结点

来源:互联网 发布:巨人网络a股上市 编辑:程序博客网 时间:2024/06/04 20:05

图见书

思路:

(1) 若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点 B )

(2) 若该节点不存在右子树:这时分两种情况:

2.1 该节点为父节点的左子节点,则下一个节点为其父节点(如图节点 D )

2.2 该节点为父节点的右子节点,则沿着父节点向上遍历,知道找到一个节点的父节点的左子节点为该节点,则该节点的父节点下一个节点(如图节点 I ,沿着父节点一直向上查找找到 B ( B 为其父节点的左子节点),则 B 的父节点 A 为下一个节点)。


/*public class TreeLinkNode {    int val;    TreeLinkNode left = null;    TreeLinkNode right = null;    TreeLinkNode next = null;    TreeLinkNode(int val) {        this.val = val;    }}*/public class Solution {    public TreeLinkNode GetNext(TreeLinkNode pNode)    {        if(pNode==null)            return null;        TreeLinkNode next=null;        if(pNode.right!=null){//节点有右子树            TreeLinkNode temp=pNode.right;            while(temp.left!=null){                temp=temp.left;            }            next=temp;            }else if(pNode.next!=null){//结点有父结点            TreeLinkNode cur=pNode;//par指parent父结点            TreeLinkNode par=cur.next;            while(par!=null&&par.right==cur){//有父结点,并且该结点为其父结点的右子树                cur=par;                par=par.next;            }            next=par;        }        return next;    }}


原创粉丝点击