LeetCode部分题解

LeetCode Algorithm部分.145

【145】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].

本题的意思是后序遍历二叉树。所谓遍历(Traversal)就是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。而后序遍历则是访问根结点的操作发生在遍历其左右子树之后。

本文将给出通过C++实现两种常见的后序遍历的方法。

按照题目给出二叉树的数据结构

struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };
1.递归

如果通过递归的话比较简单,按照后序遍历的定义即可。具体代码如下

void postorder(TreeNode *root, vector<int>& res){
     if(root != NULL){
          postorder(root->left, res);
          postorder(root->right, res);
          res.push_back(root->val);
     }
} 
vector<int> postorderTraversal(TreeNode *root)//原题给出
{
     vector<int> res;
     postorder(root, res);
     return res;
} 

然而题目里Note所说,用递归是毫无意义的(太简单了,而且浪费空间),所以下面用迭代的方式

2.迭代

这里用一张图来分析一下

详解
此图来自http://blog.csdn.net/fansongy/article/details/6798278/

我通过用一个栈来储存节点,下面是我的代码

vector<int> postorderTraversal(TreeNode *root)
{
    vector<int> res;
    if(root == NULL) return res;//如果树为空的话返回一个空向量
    stack<TreeNode *> stackOfT;//用于储存节点
    TreeNode *tem = root;//用于记录目前正进行判断的节点
    TreeNode *last = root;//用于记录最近一次访问过的节点
    stackOfT.push(tem);
    while (!stackOfT.empty())
    {
        tem = stackOfT.top();//顶端的节点为目前要判断的节点
        if( (tem->left == NULL && tem->right == NULL) || (tem->right == NULL && last == tem->left) || (last == tem->right) )
        {
            res.push_back(tem->val);
            last = tem;
            stackOfT.pop();
        }//判断是否访问该节点:1.为叶子节点 2. 右子节点为空且左子节点已访问 3.右子节点已访问。 若符合上者条件之一即访问该节点,将其元素加入向量中,将其标记为最近一次访问的节点,将该节点从栈中剔除。
        else 
        {
            if(tem->right != NULL) stackOfT.push(tem->right);
            if(tem->left != NULL) stackOfT.push(tem->left);
        }//否则,向栈中压入节点,先压右节点,后压左节点,这样在后来访问时便可以按先左后右的顺序。
    }
    return res;
}

以上是我对这道题的解答,如若有不足之处请多指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值