剑指offer 58题 【树】二叉树的下一个结点
来源:互联网 发布:数据透视表汇总求和 编辑:程序博客网 时间:2024/06/18 17:52
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
牛客传送门:点击打开链接
思路:
①判断当前节点是否有右子树,如果有,那么右子树最左节点就是返回值。
②如果没有右子树,则判断父节点的左子树是不是当前节点,若是则返回父节点;若不是则把当前节点设置为父节点,继续这个判断。
class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; }}public class Title58 { public TreeLinkNode GetNext(TreeLinkNode pNode) { if(pNode == null) return null; TreeLinkNode ret = null; // 如果当前节点的右子树不为空, 则下一个节点是右子树的最左子节点 if(pNode.right != null){ ret = pNode.right; while(ret.left != null) ret = ret.left; return ret; } if(pNode.next != null){ ret = pNode.next; while(ret != null && ret.left != pNode){ // 这里注意ret为空的情况 pNode = ret; ret = ret.next; } return ret; } return ret; } public static void main(String[] args) { TreeLinkNode a = new TreeLinkNode(6); TreeLinkNode b = new TreeLinkNode(2); TreeLinkNode c = new TreeLinkNode(8); TreeLinkNode d = new TreeLinkNode(1); TreeLinkNode e = new TreeLinkNode(4); TreeLinkNode f = new TreeLinkNode(7); TreeLinkNode g = new TreeLinkNode(9); TreeLinkNode h = new TreeLinkNode(3); TreeLinkNode i = new TreeLinkNode(5); TreeLinkNode j = new TreeLinkNode(10); a.left = b;a.right = c; b.left = d;b.right = e; c.left = f;c.right = g; e.left = h;e.right = i; g.right = j; b.next = a;c.next = a; d.next = b;e.next = b; f.next = c;g.next = c; h.next = e;i.next = e; j.next = g; // 进行一次中序遍历 List<TreeLinkNode> list = new ArrayList<TreeLinkNode>(); new Title58().print(a,list); // 输出值:1 2 3 4 5 6 7 8 9 10 list.forEach( n -> System.out.print(n.val + " ") ); // 另一种lambda写法 // List<Integer> numList = list.stream().map((r) -> r.val).collect(Collectors.toList()); // System.out.println(numList); // 遍历list,输出当前节点的下一节点val // 输出值: 2 3 4 5 6 7 8 9 10 null for(TreeLinkNode node : list){ TreeLinkNode next = new Title58().GetNext(node); if(next != null) System.out.print(next.val + " "); else System.out.println("null"); } } public void print(TreeLinkNode root,List<TreeLinkNode> list){ if(root.left != null) print(root.left,list); list.add(root); if(root.right != null) print(root.right,list); }}
0 0
- 剑指offer 58题 【树】二叉树的下一个结点
- 剑指offer--二叉树的下一个结点
- 《剑指offer》二叉树的下一个结点
- 《剑指offer》-- 二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- [剑指offer]二叉树的下一个结点
- 剑指offer-二叉树的下一个结点
- 《剑指offer》二叉树的下一个结点
- 剑指offer: 二叉树的下一个结点
- 剑指offer 二叉树的下一个结点
- 剑指offer-二叉树的下一个结点
- 【剑指offer】二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer--二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- poj2632Crashing Robots(模拟)
- 为什么找不到工作的是你,技术差的还是你?
- thrift远程调用示例
- 对于android.intent.action.MAIN和android.intent.category.LAUNCHER的理解
- 关于yuv 格式-Semi Planar和Planar
- 剑指offer 58题 【树】二叉树的下一个结点
- 【HDU】5742 It's All In The Mind
- 设置windows的默认调试器
- hd 1009 FatMouse' Trade (贪心)
- 互联网金融全面洗礼,民生电商金融基因凸显优势
- C++类
- 函数钩子-Dll注入
- hdu 5744(2016 Multi-University Training Contest 2)
- 谷歌GCM 接入笔记1