剑指 Offer II 053. 二叉搜索树中的中序后继(285.二叉搜索树中的中序后继)
题目:

 
思路:
【1】中序遍历
【2】利用二叉搜索树的性质
代码展示:
利用二叉搜索树的性质的方式:
//时间2 ms击败100% //内存42.2 MB击败74.85% //时间复杂度:O(n),其中 n 是二叉搜索树的节点数。遍历的节点数不超过二叉搜索树的高度,平均情况是 O(logn),最坏情况是 O(n)。 //空间复杂度:O(1)。 class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { TreeNode successor = null; //这里是利用了中序遍历的的特性,如果存在右子树,那么最左边的节点就是后继节点 if (p.right != null) { successor = p.right; while (successor.left != null) { successor = successor.left; } return successor; } TreeNode node = root; while (node != null) { //这里才是用到了二叉搜索树的特性 if (node.val > p.val) { successor = node; node = node.left; } else { node = node.right; } } return successor; } }
中序遍历的方式(由于所谓的后继节点其实也就是中序遍历中该节点的下一个节点,所以中序遍历一下然后将全部节点存于数组中就可以很容易找出来):
//时间4 ms击败35.35% //内存42.5 MB击败29.22% //时间复杂度:O(n),其中 n 是二叉搜索树的节点数。中序遍历最多需要访问二叉搜索树中的每个节点一次。 //空间复杂度:O(n),其中 n 是二叉搜索树的节点数。空间复杂度取决于栈深度,平均情况是 O(logn),最坏情况是 O(n)。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { ArrayList<TreeNode> treeList = new ArrayList<>(); middleDFS(root,treeList); for (int i = 0; i < treeList.size();i++){ if (treeList.get(i) == p && i+1 < treeList.size()) return treeList.get(i+1); } return null; } public void middleDFS(TreeNode root,ArrayList<TreeNode> list){ if (root == null) return; if (root.left != null) middleDFS(root.left,list); list.add(root); if (root.right != null) middleDFS(root.right,list); } }

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号