码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的后序遍历(简单)

时间:2017-12-26 00:54:56      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:return   append   nod   编写   his   pop   new   tar   递归调用   

开始看了中序遍历觉得后序遍历的非递归方法也会很容易,而后自己开始尝试编写程序,发现并不是这样的后序遍历的实现很复杂

直接放代码

Java版的递归调用

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */


public class Solution {
    /*
     * @param root: A Tree
     * @return: Postorder in ArrayList which contains node values.
     */
    public List<Integer> postorderTraversal(TreeNode root) {
        LinkedList<Integer> targetList = new LinkedList<>();
        if(root == null)
            return null;
        if(root.left!=null)
            targetList.addAll(postorderTraversal(root.left));
        if(root.right!=null)
            targetList.addAll(postorderTraversal(root.right));
        targetList.add(root.val);
        
        return targetList;
        
    }
}

  

递归版的非常的容易,在此不在讲解

下面放上非递归版的代码

Python版非递归:

 

"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""


class Solution:
    """
    @param: root: A Tree
    @return: Postorder in ArrayList which contains node values.
    """
    def postorderTraversal(self, root):
        if root is None:
            return []
        temp = [] #用栈结构存储节点
        target = [] #结果列表
        last = None #用来存储最后的节点
        cur = root
        
        while cur is not None: #循环遍历到左子树底
                temp.append(cur)
                cur = cur.left
        
        while len(temp) > 0:
            cur = temp.pop() #出栈
            if cur.right is None or last is cur.right: #这里进行判断,若当前的根节点没有右子树,或者当前的节点的右节点已经被标注成使用过的节点
                target.append(cur.val)
                last = cur #将当前的节点标注成使用过的节点
            else:
                temp.append(cur) #如果不是则将根节点放回temp中继续遍历右子树
                cur = cur.right
                while cur is not None:#右子树继续遍历左子树
                    temp.append(cur)#入栈
                    cur = cur.left
                    
        return target

  

每次一定要去努力思考再去借鉴别人的思路!!!!!!!!

二叉树的后序遍历(简单)

标签:return   append   nod   编写   his   pop   new   tar   递归调用   

原文地址:https://www.cnblogs.com/KanHin/p/8111693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!