[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;
}