您的位置:首页 > Web前端

《剑指offer》编程题java实现(二十八):二叉树的下一个节点

2018-03-17 12:10 411 查看
问题描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针

思路分析

熟悉中序遍历的模式中左右,下一个节点可以分为以下三种情况:

该节点有右节点,那么下一个节点就是右节点子树部分中的左节点

该节点没有右节点,但是是父节点的左节点,那么,下一个节点就是父节点

该节点没有右节点,同时也是父节点的右节点,这种情况比较麻烦,要向上一直遍历,直到找到是它父节点的左子节点的节点,那么这个节点的父节点就是下一个节点

上述过程中要时刻判断,是否为空的情况。

代码展示

注意该代码是可以优化的,这样写只是便于考虑

package com.offer;
public class GetNextTreeLinkNode {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
if (pNode == null) {
return null;
}
TreeLinkNode next = null;
// 该节点有右节点
if (pNode.right != null) {
// 查找该右节点部分的左节点
TreeLinkNode rightNode = pNode.right;
while (rightNode.left != null)
rightNode = rightNode.left;
next = rightNode;
// 该节点没有右节点
} else if (pNode.next != null) {//该节点有父节点
TreeLinkNode parentNode = pNode.next;// 其实就是父节点,牛客网是这样定义的
TreeLi
4000
nkNode curNode = pNode;
if (pNode == parentNode.right) {//为父节点的右节点
while (parentNode.next != null) {
curNode = parentNode;
parentNode = parentNode.next;
if (curNode == parentNode.left) {
next = parentNode;
break;
}
}
} else //为父节点的左节点
next = parentNode;
}
return next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: