• [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;
        }

      

  • 相关阅读:
    Flex 学习笔记 XML对象(转)
    Flex 学习笔记 自定义时间控件(带分秒时显示)
    Flex 学习笔记 flexlib控件之_Base64Image(图片Base64互换
    ibatis ora01000 超出最多允许打开的游标数 解决方法
    Flex 学习笔记 Datagrid中选中某行时光标定位
    Flex 学习笔记 LineChart双坐标
    Flex 学习笔记 Graphics
    Flex 学习笔记 String长度
    Flex 学习笔记 Image保存(ImageSnapshot)
    [转]站长实用,42个著名搜索引擎免费登陆入口大全
  • 原文地址:https://www.cnblogs.com/271934Liao/p/7026169.html
Copyright © 2020-2023  润新知