zoukankan      html  css  js  c++  java
  • 算法-二叉树-1

    先序遍历 非递归写法

    1. 先入栈 弹出 打印 

    2. 然后先压入右节点 再压入左节点

    3. 重复

     1 public void printPre(TreeNode node) {
     2         Stack<TreeNode> stack = new Stack<>();
     3         stack.push(node);
     4         while (!stack.isEmpty()) {
     5             TreeNode pop = stack.pop();
     6             System.out.println(pop.value);
     7             if (pop.right != null) {
     8                 stack.push(pop.right);
     9             }
    10             if (pop.left != null) {
    11                 stack.push(pop.left);
    12             }
    13 
    14         }
    15     }

    中序遍历 非递归写法

    1. 先入栈所有的左子节点

    2. 弹出节点 输出 并压入弹出节点的右节点的左子节点

     1 public void printMid(TreeNode node) {
     2         Stack<TreeNode> stack = new Stack<>();
     3         while (node != null || !stack.isEmpty()) {
     4             if (node != null) {
     5                 stack.push(node);
     6                 node = node.left;
     7             } else {
     8                 TreeNode pop = stack.pop();
     9                 System.out.println(pop.value);
    10                 node = pop.right;
    11             }
    12         }
    13 
    14     }

    后序遍历 非递归写法

    1. 两个栈stack/result

    2. 头节点先压入stack栈

    3. 弹出放入result栈

    4. stack栈压入stack弹出节点的左子节点 右子节点

    5. 直到stack为空 依次弹出result为后序

     1  public void printAfter(TreeNode node){
     2         Stack<TreeNode> stack = new Stack<>();
     3         Stack<TreeNode> result = new Stack<>();
     4         stack.push(node);
     5         while (!stack.isEmpty()){
     6             TreeNode pop = stack.pop();
     7             result.push(pop);
     8             if (pop.left != null){
     9                 stack.push(pop.left);
    10             }
    11             if (pop.right != null){
    12                 stack.push(pop.right);
    13             }
    14         }
    15         while (!result.isEmpty()){
    16             TreeNode pop = result.pop();
    17             System.out.print(pop.value+" ");
    18         }
    19 
    20     }

     宽度优先遍历

    使用一个队列,先放入头节点 弹出打印 然后先放左后放右

     1  public int width(TreeNode node){
     2         Queue<TreeNode> queue = new LinkedList<>();
     3         queue.offer(node);
     4         TreeNode nodeCurEnd = node;
     5         TreeNode nextEnd = null;
     6         int max = Integer.MIN_VALUE;
     7         int curLevelNodes = 0;
     8         while (!queue.isEmpty()){
     9             TreeNode poll = queue.poll();
    10             curLevelNodes++;
    11             if (poll.left != null){
    12                 queue.offer(poll.left);
    13                 nextEnd = poll.left;
    14             }
    15             if (poll.right != null){
    16                 queue.offer(poll.right);
    17                 nextEnd = poll.right;
    18             }
    19             if (poll == nodeCurEnd){
    20                 max = Math.max(max,curLevelNodes);
    21                 curLevelNodes = 0;
    22                 nodeCurEnd = nextEnd;
    23             }
    24         }
    25         return Math.max(max,curLevelNodes);
    26     }

    算法题:

    1. 判断是否是搜索二叉树

      中序遍历 有序才是搜索二叉树

    2. 判断是否是完全二叉树

      宽度遍历 满足两个条件,1. 不能只有右孩子没有左孩子节点 2. 当第一次出现叶子节点的时候 后面的节点必须都是叶子节点

    3. 判断是否是满二叉树

      1. 满二叉树节点个数 = 2 * 最大深度 -1

    4. 判断是否是平衡二叉树

      对于任何子树来说 左数的高度与右树的高度相差不超过1

      左子树与右子树都是平衡树

    二叉树算法套路

    创建一个对象用于存储需要的数据

    左子树返回结果

    右子树返回结果 

    组合结果然后返回

  • 相关阅读:
    Mono 4.0 Mac上运行asp.net mvc 5.2.3
    ASP.NET SignalR 高可用设计
    .NET Fringe 定义未来
    微软“.Net社区虚拟大会”dotnetConf2015 第二天 无处不在的Xamarin
    微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台
    Mono产品生命周期
    Paket 介绍
    谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC
    Visual Studio 2015 CTP6 发布
    皮裤原理和运营微信公众号dotNET跨平台
  • 原文地址:https://www.cnblogs.com/isnotnull/p/14979148.html
Copyright © 2011-2022 走看看