zoukankan      html  css  js  c++  java
  • 二叉树的前序遍历

    二叉树的前序遍历(Leetcode 144)

    数据结构定义:

     // Definition for a binary tree node.
      public class TreeNode {
          int val;
          TreeNode left;
          TreeNode right;
          TreeNode() {}
          TreeNode(int val) { this.val = val; }
          TreeNode(int val, TreeNode left, TreeNode right) {
              this.val = val;
              this.left = left;
              this.right = right;
          }
      }
    

    递归写法:

    class Solution {
        public List<Integer> result = new ArrayList<>();
        public List<Integer> preorderTraversal(TreeNode root) {
            if(root == null)
                return  new ArrayList<>();
            result.add(root.val);
            if(root.left != null)
                preorderTraversal(root.left);
            if(root.right != null)
            preorderTraversal(root.right);
    
            return result;
        }
    }
    

    普通迭代:

    class Solution {
        
        public List<Integer> preorderTraversal(TreeNode root) {
            if(root == null)
                return new ArrayList<Integer>(); 
            List<Integer> result = new ArrayList<>();
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while(!stack.isEmpty()){
                TreeNode node =stack.pop();
                result.add(node.val);
                if(node.right != null){
                    stack.push(node.right);
                }
                if(node.left != null){
                    stack.push(node.left);
                }
            } 
            return result;
        }
    }
    

    只保存右节点的迭代

    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            if(root == null)
                return result;
            Stack<TreeNode> stack = new Stack<>();
            TreeNode node =root;
            while(node != null){
                result.add(node.val);
                if(node.right != null){
                    stack.push(node.right);
                }
                if(node.left != null){
                    node = node.left;
                }else{
                    if(!stack.isEmpty()){
                        node = stack.pop();
                    }else{
                        break;
                    }
                }
            }
            return result;
        }
    }
    

    莫里斯遍历

    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            if(root == null)
                return result;
            TreeNode node = root;
            while(node != null){
                if(node.left == null){
                    result.add(node.val);
                    node = node.right;
                }else{
                    TreeNode pre = node.left;
                    while(pre.right != null && pre.right != node) // 找到左子树下的最右节点
                        pre = pre.right;
                        
                    if(pre.right == null){
                        result.add(node.val);
                        pre.right = node;
                        node = node.left;
                    }else{
                        pre.right = null;
                        node = node.right;
                    }
                }
            }
            return result;
        }
    }
    

    莫里斯遍历请参考:

    二叉树中序遍历的三种方式
  • 相关阅读:
    MacOS Sierra允许运行任何来源的程序
    Windows Server2008 R2中的角色
    Linux根目录解析
    Linux安装配置SVN服务器
    Linux6.x修改出eth0网卡的解决方法
    如何利用mount命令挂载另一台服务器上的目录
    Arcgis水文分析-Dem提取集水区
    前端布局之Flex布局
    其实我就是想好好的写写代码(一个伪程序猿的独白)
    WebApi关于配置全局返回Json数据格式时间以及命名小写
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/13792950.html
Copyright © 2011-2022 走看看