二叉搜尋樹的第k個結點
阿新 • • 發佈:2018-12-10
題目
給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如 按結點數值大小順序第三個結點的值為4。
思路
利用二叉搜尋數中序遍歷有序的特點,用遞迴和迭代分別實現中序遍歷。
package com.zhumq.leetcode;
import java.util.Stack;
public class KthNode {
public class TreeNode{
TreeNode left;
TreeNode right;
int val;
public TreeNode(int val){
this.val = val;
}
}
/**
* 解法1:非遞迴的中序遍歷,每次出棧時令計數count++,當count==k,返回彈出的節點即可
*/
public TreeNode kthNode1(TreeNode pRoot,int k) {
if(pRoot == null|| k==0) return null;
int count = 0;
Stack<TreeNode> stack = new Stack<>();
while(!stack.isEmpty()) {
//遍歷最左下節點
while(pRoot != null) {
stack.push(pRoot);
pRoot = pRoot.left;
}
//到左下後出棧
pRoot = stack. pop();
count++;
if(count == k) return pRoot;
}
return null;
}
/**
* 解法2:遞迴的中序遍歷
*/
//定義成員變數result和count
private TreeNode result;
private int count;
public TreeNode kthNode2(TreeNode pRoot,int k) {
inorder(pRoot,k);
return result;
}
private void inorder(TreeNode pRoot, int k) {
//一個方法呼叫另一個方法,裡面方法要使用外面方法的引數時需要通過引數傳進來不能直接使用!
if(pRoot == null) return;
if(count > k) return;
//左根右,先遍歷左子樹,左子樹遍歷結束當前節點再count++
inorder(pRoot.left,k);
count++;
//最後遍歷右子樹
inorder(pRoot.right,k);
}
}