zoukankan      html  css  js  c++  java
  • 二叉树

    二叉树的定义是每个结点最多只能有两个子节点;
    对于一些二叉树的问题常常用到的编程思想就是递归;
    二叉树重要的就是遍历问题,主要有前序遍历,中序遍历,后序遍历和层序遍历,各种遍历方法的命名是看当前结点的访问顺序;
    在遍历的过程中,可能遇到合适的答案就要返回,合理的利用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);
                }
          }
    }
    
  • 相关阅读:
    mina简介
    idea编辑器jdk版本报错
    设计模式之-工厂模式
    设计模式之-外观模式
    ssm项目中bean注入失败,获取spring中指定bean之解决方案
    Jquery.Page.js 分页插件的使用
    发现某网站低级致命漏洞引发的对多用户系统安全性讨论
    C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一)
    有关C#中使用if else和try catch的问题及效率问题
    C#伪静态实现的方法
  • 原文地址:https://www.cnblogs.com/noob-l/p/13602269.html
Copyright © 2011-2022 走看看