145-LeetCode 二叉树的后序遍历

[toc]


题目

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

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




思路:
后序遍历:左 右 根
我们知道前序遍历是:根 左 右-------
同时可以很容易实现:根 右 左-------
根 右 左 逆序 就是 左 右 根

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <stack>
#include <vector>

using namespace std;

struct TreeNode
{
    int data;
    TreeNode * left;
    TreeNode * right;
    TreeNode(int value)
    {
        data = value;
        left = NULL;
        right = NULL;
    }
};

/*
 后序遍历:左  右  根
 我们知道前序遍历是:根 左 右-------
 同时可以很容易实现:根 右 左-------
                   根 右 左逆序就是 左 右 根 
*/
void BackOrder(TreeNode * root)
{
    if(root == NULL)
    {
        return;
    }

    std:vector<int> result;

    // 先实现根右左
    stack<TreeNode *> s;
    s.push(root);
    while(!s.empty())
    {
        TreeNode * temp = s.top();
        result.push_back(temp->data);
        s.pop();

        if(temp->left)
        {
            s.push(temp->left);
        }
        if(temp->right)
        {
            s.push(temp->right);
        }
    }

    for(int i = result.size()-1; i >= 0; --i)
    {
        cout << result[i] << " ";
    }
    cout << endl;
}


int main()
{
    TreeNode root(8);
    TreeNode node1(4);
    TreeNode node2(2);

    TreeNode node3(9);
    TreeNode node4(12);

    TreeNode node5(1);
    TreeNode node6(5);

    root.left = &node1;
    root.right = &node2;

    node1.left = &node3;
    node1.right = &node4;

    node2.left = &node5;
    node2.right = &node6;

    BackOrder(&root); 

    return 0;
}

输出结果:

9 12 4 1 5 2 8 



法二:递归实现

后序遍历:左 右 根

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <stack>
#include <vector>

using namespace std;

struct TreeNode
{
    int data;
    TreeNode * left;
    TreeNode * right;
    TreeNode(int value)
    {
        data = value;
        left = NULL;
        right = NULL;
    }
};

// 递归实现
void DiGuiBackOrder(TreeNode * root)
{
    if(root == NULL)
    {
        return;
    }

    DiGuiBackOrder(root->left);
    DiGuiBackOrder(root->right);
    cout << root->data << " ";
}

int main()
{
    TreeNode root(8);
    TreeNode node1(4);
    TreeNode node2(2);

    TreeNode node3(9);
    TreeNode node4(12);

    TreeNode node5(1);
    TreeNode node6(5);

    root.left = &node1;
    root.right = &node2;

    node1.left = &node3;
    node1.right = &node4;

    node2.left = &node5;
    node2.right = &node6;
    
    DiGuiBackOrder(&root);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值