【剑指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