标签:结点 TreeNode offer public next pNode 二叉树 节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结 点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指 针。
思路:若节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指 向左子结点的指针找到的叶子节点即为下一个节点;若节点不是根节点。如果该节 点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重 复之前的判断,返回结果。
二叉树结构定义
package Test;
//二叉树
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode next;//指向上一个节点(父节点)
public TreeNode(int x) {
val = x;
}
}
package Function;
//首先中序遍历的一个结点的下一个节点不可能在左子树上。
// 1.若有右子树则在右子树最左的结点;
// 2.若没有右子树,下一个节点是父节点且必须满足父节点是爷爷结点的左孩子,
// 若有父节点,但不满足父节点是爷爷结点的左孩子,则向上走(pNode=pNode.next),判断爷爷节点是否满足条件,直到满足条件或者没有父节点了,没有父结点返回null
import Test.TreeNode;
public class GetNext08 {
//任意一个节点pNode
public TreeNode GetNext(TreeNode pNode) {
if (pNode == null)
return null;
//有右子树
if (pNode.right != null) {
pNode = pNode.right;
//下一个结点为右子树的最左子树
while (pNode.left != null) {
pNode = pNode.left;
}
return pNode;
}
//无右子树 返回自己的父节点
while (pNode.next != null) {
// 找 第 一 个 当 前 节 点 是 父 节 点 左 孩 子 的 节 点
if (pNode.next.left == pNode)
return pNode.next;
}
return null;
}
public static void main(String[] args) {
TreeNode p1=new TreeNode(1);
TreeNode p2=new TreeNode(2);
TreeNode p3=new TreeNode(3);
TreeNode p4=new TreeNode(4);
TreeNode p5=new TreeNode(5);
TreeNode p6=new TreeNode(6);
p1.left=p2;p2.next=p1;
p1.right=p3;p3.next=p1;
p2.left=p4;p4.next=p2;
p2.right=p5;p5.next=p2;
p3.right=p6;p6.next=p3;
GetNext08 p=new GetNext08();
TreeNode m=p.GetNext(p2);
System.out.println(m.val);
}
}
LuckyAsYou
发布了14 篇原创文章 · 获赞 0 · 访问量 493
私信
关注
标签:结点,TreeNode,offer,public,next,pNode,二叉树,节点 来源: https://blog.csdn.net/qq_36113761/article/details/104600491
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。