思路:
方法1:使用二叉树的中序遍历非递归版,利用栈和一个计数变量得到第k小节点。
TreeNode KthNode(TreeNode pRoot, int k) { if(k==0)return null; Stack<TreeNode> stack = new Stack<>(); while(pRoot!=null||!stack.isEmpty()){ if(pRoot!=null){ stack.push(pRoot); pRoot=pRoot.left; }else{ TreeNode node = stack.pop(); if(--k==0) return node; pRoot = node.right; } } return null; }
方法2:使用dfs,中序遍历用全局变量记录递归过程的次数和节点引用。
int time = 0; TreeNode node = null; TreeNode KthNode(TreeNode pRoot, int k) { dfs(pRoot,k); return node; } void dfs(TreeNode pRoot,int k){ if(pRoot == null)return; KthNode(pRoot.left,k); if(++time==k){ node = pRoot; return; } KthNode(pRoot.right,k); }