二叉树的定义是每个结点最多只能有两个子节点;
对于一些二叉树的问题常常用到的编程思想就是递归;
二叉树重要的就是遍历问题,主要有前序遍历,中序遍历,后序遍历和层序遍历,各种遍历方法的命名是看当前结点的访问顺序;
在遍历的过程中,可能遇到合适的答案就要返回,合理的利用return语句可以达到剪枝的效果;
二叉搜索树又叫二叉排序树,定义是左子树所有结点的值都小于当前结点,右子树所有结点的值到大于当前结点的值,左子树和右子树也都是二叉搜索树,因此二叉搜索树就牵扯到了有序的数据,一般采用的就是中序遍历,这样遍历过程中得到的就是有序的。
下面就着重介绍一下几种遍历方式:
前序遍历
前序遍历是指先访问当前结点,然后再一次访问左子树和右子树。
递归方式实现前序遍历:
public void fun(Node root)
{
if(root==null)
return;
//针对当前结点的处理
....
fun(root->left);
fun(root->right);
}
非递归方式实现前序遍历:
public void fun(TreeNode root) {
if(root==null)
return ;
Stack<TreeNode> s=new Stack<>();
s.push(root);
while(!s.isEmpty())
{
TreeNode node=s.pop();
//对当前结点进行处理;
........
if(node.right!=null)
s.push(node.right);
if(node.left!=null)
s.push(node.left);
}
}
中序遍历
中序遍历的访问顺序是先访问当前结点的左子树,再访问当前结点,再访问当前结点的右子树;
递归方式实现中序遍历:
public void fun(Node root)
{
if(root==null)
return ;
fun(root-left);
//针对当前结点的处理;
......
fun(root->right);
}
非递归方式实现中序遍历:
public void fun(TreeNode root) {
Stack < TreeNode > stack = new Stack < > ();
TreeNode curr = root;
while (curr != null || !stack.isEmpty()) {
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
//当前结点处理;
.......
curr = curr.right;
}
}
后序遍历
后续遍历的访问顺序是一次访问当前结点的左子树,右子树,最后访问当前结点;
public void fun(Node root)
{
if(root==null)
return ;
fun(root-left);
fun(root->right);
//针对当前结点的处理
....
}
层序遍历
层序遍历是指一层一层的对二叉树的遍历,一般就是从上到下,从左到右进行遍历;
层序遍历的实现方式:
public void fun(Node root)
{
if(root==null)
return ;
Queue<Node> q=new Queue<>();
q.offer(root);
while(!q.isEmpty())
{
int size=q.size();
//可以实现只针对同一层的处理,也可以不加这个while,看情况而定;
while((size--_>0)
{
Node node=q.poll();
//进行处理
if(node.left!=null)
q.offer(node.left);
if(node.right!=null)
q.offer(node.right);
}
}
}