zoukankan      html  css  js  c++  java
  • 【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 };
  • 相关阅读:
    bash特性
    FHS 层级文件系统
    环境变量的问题
    linux认识
    搜索引擎的使用
    nginx
    部署操作手册
    git
    添加tag
    pycharm中使用git
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4609307.html
Copyright © 2011-2022 走看看