关于二叉查找树的操作还是挺重要的,所以在此实现了BST的相关操作。
一、BST树的相关定义
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
二、BST的相关操作
首先实现BST的遍历操作吧,一般面试也喜欢问,比较重要的是各个遍历的非递归操作,在这里也就只实现非递归操作;
其中先序和中序遍历的非递归操作比较相似,主要思想就是将每个节点当做一个根节点进行操作。后序遍历稍微不同。下面进行代码的演示,以及相关解释:
首先针对先序遍历
Stack<TreeNode> snode = new Stack<>(); TreeNode p = root; while (!snode.isEmpty() || p != null) { if (p!=null) { System.out.print(p.value+" "); snode.push(p); p = p.left; }else{ TreeNode q = snode.pop(); p = q.right; } }
可以看到代码中利用了一个栈进行辅助,因为先序遍历的顺序是根-左-右,所以在向左节点进行遍历的时候,将节点输出,同时将节点放入栈中。当向左边到达顶的时候,就将栈顶的节点pop出来,如果这个节点的右节点不为空,就向这个节点的右边遍历,这时,将这个节点看做根节点,重复之前的操作。
当然,这里还有一个更好的方法,是利用栈的后进先出的特性,这个方法是我在面试思科的时候,面试官告诉我的,所以当时对于思科的影响很好。代码如下:
Stack<TreeNode> snode = new Stack<>(); snode.push