Leetcode: 二叉树的后序遍历

Leetcode: 二叉树的后序遍历


后遍历的流程:一直往下走,把路口记下来,假如路口有馒头,我们是不吃的,因为要先吃最后的,中间的岔路如果有岔路,就把右边的岔路记下来,但是因为右边没有走过,所以访问的时候也不能吃,但是左边的路因为一直往下走,所以左边没有路了,再次回头左边那些路时,那些馒头就可以吃了。

题目:
给定一个二叉树,返回它的后序遍历。

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [3,2,1]

Python 实现

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Stack:
    def __init__(self,x,status):
        self.node = x
        self.p = status
        
class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        result = []
        stack = []
        flag = 1
        while True:
            while root and flag:
                stack.append(Stack(root,0))
                if root.right:
                    stack.append(Stack(root.right,1)) #右边的节点还没完全遍历完,所以不能访问。
                root = root.left
            if len(stack) == 0:
                return result
            tmp = stack.pop()
            root = tmp.node
            flag = tmp.p
            if flag == 1: #这个节点不能访问,需要访问完子节点才能访问
                continue
            result.append(root.val)
            
            

C语言实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
struct Stack{
    struct TreeNode *node;
    int p;
};
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    int *result = (int *)malloc(sizeof(int) * 100);
    int i = 0;
    struct Stack stack[100]; //模拟栈;
    
    int top = -1; //栈顶
    int flag = 1;
    while(true){
        while(flag == 1 && root){
            stack[++top].node = root;
            stack[top].p = 0; //这个节点可以直接访问;
            if(root->right){
            stack[++top].node = root->right;
            stack[top].p = 1; // 右节点就不能直接被访问;
            }
            root = root->left;
        }
        if(top == -1){
            *returnSize = i;
            return result;
        }
        root = stack[top].node; //访问栈顶元素,
        flag = stack[top--].p;
        if(flag == 1)
            continue; // 这时候还不能被访问的,
        result[i++] = root->val;     
    }
    
}
posted @ 2018-09-18 19:48  罗梁  阅读(707)  评论(0编辑  收藏  举报