剑指offer面试题58 二叉树的下一个节点(Java实现)

来源:互联网 发布:wifi网络电话软件 编辑:程序博客网 时间:2024/05/20 23:59

解题思路:

1.如果一个节点有右子树,那么他的下一个节点就是它的右子树中的最左子节点。

2.如果一个节点没有右子树,并且该节点是它父节点的左子节点,那么它的下一个节点就是它的父节点。

3.如果一个节点没有右子树,并且该节点是它父节点的右子节点,需要沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。

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 nextNode = null; //如果一个节点有右子树,那么他的下一个节点就是他的右子树中的最左子节点 if (pNode.right != null) { TreeLinkNode tempNode = pNode.right; while (tempNode.left != null) { tempNode = tempNode.left; }  //循环结束后temp指向pNode右子树的最左子节点 return tempNode; }   //获取父节点 TreeLinkNode next = pNode.next; if (pNode.right == null && next != null) { if (next.left  == pNode) {//如果一个节点没有右子树,并且它是父节点的左子节点,那么他的下一个节点就是他的父节点 TreeLinkNode temp = pNode.next; return temp;  }  if (next.right == pNode) {//如果一个节点没有右子树,并且它是父节点的右子节点,则沿着指向父节点的指针一直向上遍历 //直到找到一个节点,他的父节点的左子节点是它 TreeLinkNode parent = pNode.next; while (parent.next != null) { TreeLinkNode nextParent = parent.next; if (nextParent.left == parent) { return nextParent; } else { parent = parent.next; } }  //若循环结束,则证明未找到下一个节点,返回null; nextNode = null;  } }   return nextNode; }}


阅读全文
0 0
原创粉丝点击