zoukankan      html  css  js  c++  java
  • [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;
        }

      

  • 相关阅读:
    海岛争霸
    hihocoder 1089 最短路径·二:Floyd算法
    hihocoder1081 :最短路径·一
    [蓝桥杯][历届试题]蚂蚁感冒
    牛客网Wannafly挑战赛27 A: 灰魔法师
    hdu1875:畅通工程再续
    hdu1863:畅通工程
    hdu1879:继续畅通工程
    hdu1233:还是畅通工程
    洛谷 P1546 最短网络 Agri-Net
  • 原文地址:https://www.cnblogs.com/271934Liao/p/7026169.html
Copyright © 2011-2022 走看看