LeetCode145 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].

解题:

递归的还是和前面中序和先序一样,只是交换一下顺序而已

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

迭代的稍微复杂一些  总体上和前面的解法是一样的  不过这边要先访问左右节点,同样还是以左节点作为主线,不过这里要增加一个栈记录每个节点的右节点是否已经被访问过,只有当左右节点都被访问的前提下才能访问根节点

public static List<Integer> postorderTraversal2(TreeNode root) {
		 
		 List<Integer> res=new ArrayList<>();
		 Stack<TreeNode> nodeStack=new Stack<>();
		 Stack<Integer> nodeState=new Stack<>();//记录右节点是否已经访问过,1表示已经访问了,0表示未访问
		 
		 if(root==null)
			 return res;
		 else {
			nodeStack.push(root);
			nodeState.push(0);
			root=root.left;
		}
		 
		 while(!nodeStack.isEmpty())
		 {
			 while(root!=null)
			 {
				 nodeStack.push(root);
				 nodeState.push(0);
				 root=root.left;
			 }//当这个循环跳出的时候  说明nodeStak栈顶的那个节点没有左节点
			 
			 if(nodeState.peek()==1)//如果这时候已经访问过右节点了  这时候就可以访问根节点
			 {
				 res.add(nodeStack.pop().val);
				 nodeState.pop();//把根节点对应的状态值去除
				 
			 }
			 else {//访问右节点
				root=nodeStack.peek().right;
				nodeState.pop();//更改状态值 由0变1  
				nodeState.push(1);
			}
		 }
		 return res;
		
		
		
	        
	    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值