题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
题解一:递归
//既然给了二叉树的某个结点,且二叉树存储着指向父结点的指针(next), //那我们可以先找到根节点,再对树进行中序遍历,最后根据中序遍历结果找到给定结点的下一结点 private static ArrayList<TreeLinkNode> linkNodes = new ArrayList<>(); public static TreeLinkNode GetNext(TreeLinkNode pNode){ TreeLinkNode root = pNode; //找到父节点 while(root.next != null){ root = root.next; } InOrder(root); for(int i=0;i<linkNodes.size();i++){ if(pNode == linkNodes.get(i)){ if(i==linkNodes.size()-1){ return null; } return linkNodes.get(i+1); } } return null; } public static void InOrder(TreeLinkNode pNode){ if(pNode==null){ return; } InOrder(pNode.left); linkNodes.add(pNode); InOrder(pNode.right); }
题解二:分情况讨论
//1、给定节点有right,就返回right节点子树最左节点; //2、没右子树,一路向上找,返回子节点为父节点左节点的父节点,如果没有就返回null。 public static TreeLinkNode GetNext01(TreeLinkNode node) { if(node==null){ return null; } //如果有右子树,则找右子树的最左节点 if(node.right!=null){ node = node.right; while(node.left!=null){ node = node.left; } return node; } //没右子树,则找第一个当前节点是父节点左孩子的节点 while(node.next!=null){ if(node.next.left==node){ return node.next; } node = node.next; } //退到了根节点仍没找到,则返回null return null; }
初始化树:
public static class TreeLinkNode{ int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; } }
测试:
public static void main(String[] args) { int[] tree={8,6,10,5,7,9,11}; TreeLinkNode linkNode = createBinTree(tree); TreeLinkNode getNext = GetNext(linkNode); System.out.println(getNext.val); } 输出: 9