• 【Leetcode】【hard】Binary Tree Postorder Traversal


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

    解题:

    二叉树的后序遍历,比先序和中序遍历稍显麻烦一些,有兴趣可查看:二叉树先序遍历二叉树中序遍历

    后序遍历需要输出左子树后,输出右子树,最后输出当前结点。复杂的原因是,输出左右子树后,如何判断输出的结点是左还是右。如果左结点已经输出,就继续输出右;如果右结点已经输出,就输出当前结点,并pop出栈中上一层的结点继续考察。因此,后序遍历和先中序遍历代码上主要不同是:

    1、引入lastNode指针,指向刚刚输出的结点,方便判断刚刚输出的结点是上一层的左儿子还是右儿子;

    2、如果一个结点,连同其左子树和右子树都已经输出完毕,应继续pop栈中元素,但是新pop出的结点,在下一次循环中不应再循环遍历其左子树。

    因此在一个结点连同其子树都输出完毕后,将curNode置为0,这样跳过循环头部的“循环查找左子树”过程之后再pop栈中元素,从而直接进入判定阶段。

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<int> postorderTraversal(TreeNode* root) {
    13         TreeNode* curNode = root;
    14         TreeNode* lastNode = NULL;
    15         stack<TreeNode *> nodes;
    16         vector<int> res;
    17         
    18         while (curNode != NULL || !nodes.empty()) {
    19             while (curNode) {
    20                 nodes.push(curNode);
    21                 curNode = curNode->left;
    22             }
    23             
    24             curNode = nodes.top();
    25             if (curNode->right && curNode->right != lastNode) {
    26                 curNode = curNode->right;
    27             } else {
    28                 res.push_back(curNode->val);
    29                 lastNode = curNode;
    30                 nodes.pop();
    31                 curNode = NULL;
    32             }
    33         }
    34         
    35         return res;
    36     }
    37 };
  • 相关阅读:
    laravel windows下安装 gulp 和 laravel-elixir
    php-新特性,生成器的创建和使用
    laravel 使用极验验证码
    laravel 发送邮件
    laravel安装 redis 并驱动 session
    理解HTTP协议(转载)
    iOS中Block的用法,举例,解析与底层原理
    iOS自定义结构体
    dyld环境变量
    iOS中的静态库与动态库,区别、制作和使用
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4609307.html
Copyright © 2020-2023  润新知