• Binary Tree Inorder Traversal


    Binary Tree Inorder Traversal

    问题:

    Given a binary tree, return the inorder traversal of its nodes' values.

    Recursive solution is trivial, could you do it iteratively?

    思路:

      栈的方法 一直加入左节点,直到无法加入的话,弹出,弹出时观测有节点

    我的代码:

    public class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> list = new ArrayList<Integer>();
            if(root == null)    return list;
            Stack<TreeNode> stack = new Stack<TreeNode>();  
            stack.push(root);
            do
            {
                TreeNode node = stack.peek();
                if(node.left == null)
                {
                    list.add(node.val);
                    stack.pop();
                    if(node.right != null)
                    {
                        stack.push(node.right);
                    }
                }
                else
                {
                    stack.push(node.left);
                    node.left = null;
                }
            }while(!stack.isEmpty());
            return list;
        }
    }
    View Code

    他人代码:

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
    
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode cur = root;
    
        while(cur!=null || !stack.empty()){
            while(cur!=null){
                stack.add(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            list.add(cur.val);
            cur = cur.right;
        }
    
        return list;
    }
    View Code

    学习之处:

    • 自己的方法虽然可行,但是破坏了原来树的结构
    • 别人的代码用了一个特别妙的方法,加入了另外一个变量名cur,通过对cur继续一直左子树的遍历,同时cur=cur.right 防止进行死循环

    if(null == head) return new ArrayList<Integer>();
    List<Integer> inOrder = new ArrayList<Integer>();
    Stack<TreeNode> nodeStack = new Stack<TreeNode>();
    nodeStack.push(head);

    while(!nodeStack.isEmpty()){
    TreeNode curTopNode = nodeStack.peek();
    if(curTopNode.left == null){
    inOrder.add(curTopNode.val);
    nodeStack.pop();
    if(null != curTopNode.right){
    nodeStack.add(curTopNode.right);
    }
    }else{
    nodeStack.add(curTopNode.left);
    }
    }

    return inOrder;

  • 相关阅读:
    vijosP1360-八数码问题
    android——卡片式布局
    android ——悬浮按钮及可交互提示
    android ——滑动菜单
    android ——Toolbar
    android ——多线程编程
    android ——调用摄像头拍照和相册
    android ——通知管理
    android——实现跨程序访问数据
    android——SQLite数据库存储(操作)
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4313411.html
Copyright © 2020-2023  润新知