二叉搜索树(二叉排序树)的定义:具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势。
通俗的讲,就是任意某个节点的值大于左节点,小于右节点 node.right.val>node.val>node.left.val
中序遍历(左根右)的遍历顺序正好满足节点值从小到大的遍历顺序
递归方式,代码如下:定义一个全局节点和全局变量,用于存储第k小的节点,以及当前遍历的节点是第几个
public class Solution {
int count=0;
TreeNode kNode;
TreeNode KthNode(TreeNode pRoot, int k) {
inOrder(pRoot,k);
return kNode;
}
private void inOrder(TreeNode node,int k)
{
if(node==null||count>=k)//找到第K小的节点,后续节点不再遍历,提前返回
return;
inOrder(node.left,k);
count++;
if(count==k)
{
kNode=node;
return;
}
inOrder(node.right,k);
}
}
迭代法(非递归实现)
import java.util.*;
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k) {
if(pRoot==null)
return null;
int count=0;
TreeNode kNode=null;
Stack<TreeNode> stack = new Stack<>();
while(!stack.isEmpty()||pRoot!=null)
{
while(pRoot!=null)
{
stack.push(pRoot);
pRoot=pRoot.left;
}
pRoot=stack.pop();
count++;
if(count==k)
{
kNode=pRoot;
return kNode;
}
pRoot=pRoot.right;
}
return null;
}
}
总结
熟练掌握二叉树的前中后序遍历,递归及迭代法实现
熟悉它们的遍历过程的节点访问顺序