二叉树

二叉树的定义是每个结点最多只能有两个子节点;
对于一些二叉树的问题常常用到的编程思想就是递归;
二叉树重要的就是遍历问题,主要有前序遍历,中序遍历,后序遍历和层序遍历,各种遍历方法的命名是看当前结点的访问顺序;
在遍历的过程中,可能遇到合适的答案就要返回,合理的利用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);
            }
      }
}
posted @ 2020-09-02 16:06  万物小白  阅读(143)  评论(0编辑  收藏  举报