• [LeetCode] 145. Binary Tree Postorder Traversal Java


    题目:

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

    For example:
    Given binary tree {1,#,2,3},

       1
        
         2
        /
       3

    return [3,2,1].

    题意及分析:后序遍历,先遍历左子节点,然后右子节点,最后才遍历该点。这里对于任意一个节点,如果当前点没有子节点或者 已经访问过存在的子节点,那么可以直接访问该点,并输出该点的值;否则访问该点的子节点。如果用一个栈来实现,那么先从根节点起遍历,如果节点无左右子树或者已经访问过那么直接输出节点的值,否则将该点的右子节点和左子节点先后加入栈中,这样就可以保证先输出左子节点后输出右子节点。

    代码:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
           List<Integer> res = new ArrayList<>();
    		Stack<TreeNode> stack=new Stack<>();
    		stack.push(root);
    		TreeNode preNode=null;
    		while(!stack.isEmpty()&&root!=null){
    			root=stack.peek();  //得到栈顶的点
    			//如果当前节点没有子节点 或者 当前节点的左右子树都被访问,那么可以直接输出该点的值并从栈中弹出该点
    			if((root.left==null&&root.right==null)||(preNode!=null&&(root.left==preNode||root.right==preNode))){
    				root=stack.pop();
    				res.add(root.val);
    				preNode=root;
    			}else{		//同时访问该点的右子节点和左子节点,保证先输出左后输出右
    				if(root.right!=null){
    					stack.push(root.right);
    				}
    				if(root.left!=null){
    					stack.push(root.left);
    				}
    			}
    		}
    		return res; 
        }
    }
    

     方法二:

    public ArrayList<Integer> postorderTraversal(TreeNode root) {         //使用非递归实现后序遍历
            ArrayList<Integer> result = new ArrayList<>();
    
            Stack<TreeNode> stack = new Stack<>();
            TreeNode node =  root;
            while(!stack.isEmpty() || node !=null){
                if(node!=null){  //入栈的时候添加
                    stack.push(node);
                    result.add(node.val);
                    node = node.right;
                }else{
                    node=stack.pop();
                    node=node.left;
                }
            }
            Collections.reverse(result);
            return result;
        }

      

  • 相关阅读:
    WPF-WPF的内部世界-Binding
    WPF-XMAL-布局和控件-布局(一)
    SQL Server的简单使用
    redis的简单使用
    JWT
    C# 面试
    dapper的使用
    .NET发展史
    idea Jrebel升级后看不到且无法重新安装Jrebel
    laydate时间点击后马上消失
  • 原文地址:https://www.cnblogs.com/271934Liao/p/7026169.html
Copyright © 2020-2023  润新知