剑指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;
}
}
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;
}
}
相关文章推荐
- 剑指Offer实现面试题8-二叉树的下一个节点
- 《剑指offer》编程题java实现(二十八):二叉树的下一个节点
- 剑指Offer面试题58:二叉树的下一个节点
- 剑指Offer 面试题23:链表中环的入口节点 Java代码实现
- 剑指offer编程题Java实现——面试题6重建二叉树
- <剑指offer 面试题8>二叉树的下一个节点(Java)
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
- 《剑指Offer》学习笔记--面试题58:二叉树的下一个结点
- 剑指offer-面试题58-二叉树的下一个结点
- 剑指Offer 面试题22:链表中倒数第k个节点 Java代码实现
- 剑指offer-面试题58:二叉树的下一个结点
- 剑指Offer 面试题34:二叉树中和为某一值的路径 Java代码实现
- 面试题58:二叉树的下一个节点
- 剑指Offer 面试题27:二叉树的镜像 Java代码实现
- 剑指offer 面试题23 从上往下打印二叉树 Java实现
- 剑指Offer(第二版)面试题8:二叉树的下一个节点
- 剑指offer面试题63:二叉搜索树的第k个节点 Java实现
- 剑指offer--面试题19:二叉树的镜像--Java实现
- 剑指Offer:面试题19——二叉树的镜像(java实现)
- 剑指offer面试题7:重建二叉树 Java代码实现