您的位置:首页 > 职场人生

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

2017-07-21 11:24 513 查看
解题思路:

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息