标签:node 结点 58 Offer next TreeLinkNode 二叉树 null 节点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
题解一:递归
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。