其他分享
首页 > 其他分享> > 【剑指Offer】58:二叉树的下一个结点

【剑指Offer】58:二叉树的下一个结点

作者:互联网

题目描述

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

题解一:递归
 1 //既然给了二叉树的某个结点,且二叉树存储着指向父结点的指针(next),
 2 //那我们可以先找到根节点,再对树进行中序遍历,最后根据中序遍历结果找到给定结点的下一结点 
 3 private static ArrayList<TreeLinkNode> linkNodes = new ArrayList<>();
 4     public static TreeLinkNode GetNext(TreeLinkNode pNode){
 5         TreeLinkNode root = pNode;
 6         //找到父节点
 7         while(root.next != null){
 8             root = root.next;
 9         }
10         InOrder(root);
11         for(int i=0;i<linkNodes.size();i++){
12             if(pNode == linkNodes.get(i)){
13                 if(i==linkNodes.size()-1){
14                     return null;
15                 }
16                 return linkNodes.get(i+1);
17             }
18         }
19         return null;
20     }
21     public static void InOrder(TreeLinkNode pNode){
22         if(pNode==null){
23             return;
24         }
25         InOrder(pNode.left);
26         linkNodes.add(pNode);
27         InOrder(pNode.right);
28     }
题解二:分情况讨论
 1 //1、给定节点有right,就返回right节点子树最左节点;
 2 //2、没右子树,一路向上找,返回子节点为父节点左节点的父节点,如果没有就返回null。
 3     public static TreeLinkNode GetNext01(TreeLinkNode node) {
 4         if(node==null){
 5             return null;
 6         }
 7         //如果有右子树,则找右子树的最左节点
 8         if(node.right!=null){
 9             node = node.right;
10             while(node.left!=null){
11                 node = node.left;
12             }
13             return node;
14         }
15         //没右子树,则找第一个当前节点是父节点左孩子的节点
16         while(node.next!=null){
17             if(node.next.left==node){
18                 return node.next;
19             }
20             node = node.next;
21         }
22         //退到了根节点仍没找到,则返回null
23         return null;
24     }

初始化树:

1 public static class TreeLinkNode{
2         int val;
3         TreeLinkNode left = null;
4         TreeLinkNode right = null;
5         TreeLinkNode next = null;
6         TreeLinkNode(int val) {
7             this.val = val;
8         }
9     }

测试:

1 public static void main(String[] args) {
2         int[] tree={8,6,10,5,7,9,11};
3         TreeLinkNode linkNode = createBinTree(tree);
4         TreeLinkNode getNext = GetNext(linkNode);
5         System.out.println(getNext.val);
6     }
7 输出:
8  9

 

标签:node,结点,58,Offer,next,TreeLinkNode,二叉树,null,节点
来源: https://www.cnblogs.com/Blog-cpc/p/12361754.html