二叉树的后序遍历

 
public static ArrayList<Integer> postorderTraversal(TreeNode root) {
     //非空判断
    if(root == null){
           return new ArrayList<Integer>();
       }
    //栈 后进先出
    Stack<TreeNode> stack = new Stack<TreeNode>();
     //返回值
    ArrayList<Integer> list = new ArrayList<Integer>();
    //上一个处理的节点
    TreeNode pre = new TreeNode();
    stack.push(root);
    while(!stack.isEmpty()) {
       //查看栈顶元素
	  TreeNode t = stack.peek();
          //左孩子为空,右孩子为空,则为叶子节点;或上一个处理节点是当前节点的左孩子或右孩子
		if((t.left == null && t.right == null)||(pre != null && (t.left == pre || t.right == pre))) {
			list.add(t.val);
			pre = t;
			stack.pop();
		}else {
              //先右孩子入栈再左孩子入栈
			if(t.right != null) {
				stack.push(t.right);
			}
			if(t.left!=null) {
				stack.push(t.left);
			}
	  }
    }
    return list;
}

  

  

上面的是非递归解法,主要用的是栈,后进先出的特点。

 

 

 

节点类:

class TreeNode {
  int val = 0;
  TreeNode left = null;
  TreeNode right = null;
}

  

 

posted @ 2020-08-20 17:34  CodingOneTheWay  阅读(125)  评论(0编辑  收藏  举报
回到顶部