二叉树
二叉树的定义是每个结点最多只能有两个子节点;
对于一些二叉树的问题常常用到的编程思想就是递归;
二叉树重要的就是遍历问题,主要有前序遍历,中序遍历,后序遍历和层序遍历,各种遍历方法的命名是看当前结点的访问顺序;
在遍历的过程中,可能遇到合适的答案就要返回,合理的利用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);
            }
      }
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号