一【题目类别】
- 栈
二【题目难度】
- 中等
三【题目编号】
- 145.二叉树的后序遍历
四【题目描述】
- 给定一个二叉树,返回它的 后序 遍历。
五【题目示例】
- 示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
六【题目进阶】
- 进阶: 递归算法很简单,你可以通过迭代算法完成吗?
七【解题思路】
- 利用栈,后序遍历打印顺序是左->右->根,那么说明根在栈底,左在栈顶,那么我们就按照根->右->左的顺序入栈,入栈的过程中加入到List中,所以得到的是根->右->左的序列,我们要得到后序序列,最后反转即可
八【时间频度】
- 时间复杂度: O ( N ) O(N) O(N)
九【代码实现】
- Java语言版
package Stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class p145_BinaryTreePostorderTraversal {
int val;
p145_BinaryTreePostorderTraversal left;
p145_BinaryTreePostorderTraversal right;
p145_BinaryTreePostorderTraversal(int x) {
val = x;
}
public static void main(String[] args) {
p145_BinaryTreePostorderTraversal root = new p145_BinaryTreePostorderTraversal(1);
p145_BinaryTreePostorderTraversal right = new p145_BinaryTreePostorderTraversal(2);
p145_BinaryTreePostorderTraversal right2 = new p145_BinaryTreePostorderTraversal(3);
root.left = null;
root.right = right;
right.left = right2;
right.right = null;
List<Integer> res = postorderTraversal(root);
System.out.println("res = " + res);
}
public static List<Integer> postorderTraversal(p145_BinaryTreePostorderTraversal root) {
// 创建存放树结点的栈
Stack<p145_BinaryTreePostorderTraversal> stackTree = new Stack<p145_BinaryTreePostorderTraversal>();
// 创建存放结点值的栈(这里保存按照后序遍历的顺序的结点值)
Stack<Integer> stackNum = new Stack<Integer>();
// 存放结果数组
List<Integer> res = new ArrayList<Integer>();
// 先把根节点入栈,以树根为基准开始遍历
stackTree.push(root);
// 当存放树结点的栈不空的时候说明还没遍历结束
while (!stackTree.isEmpty()) {
// 将第一个元素弹出
p145_BinaryTreePostorderTraversal temp = stackTree.pop();
// 这里是重点,每次都把根节点入数栈,所以根节点肯定是最下边,最后打印输入
// 而每次入树结点栈一定要按照先左后右,因为出树栈入数栈,相当于顺序颠倒了一下
// 最后的顺序就是左->右->根
if (temp != null) {
stackNum.push(temp.val);
stackTree.push(temp.left);
stackTree.push(temp.right);
}
}
// 将数栈中元素加入结果数组
while (!stackNum.isEmpty()) {
res.add(stackNum.pop());
}
// 返回结果
return res;
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
/*树的结构*/
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int* postorderTraversal(struct TreeNode* root, int* returnSize)
{
/*创建存放树结点的栈*/
struct TreeNode** stackTree = (struct TreeNode**)malloc(sizeof(struct TreeNode*)*MAXSIZE);
/*创建存放结点值的栈(这里保存按照后序遍历的顺序的结点值)*/
struct TreeNode** stackNum = (struct TreeNode**)malloc(sizeof(struct TreeNode*)*MAXSIZE);
/*存放结果数组*/
int* res = (int*)malloc(sizeof(int)*MAXSIZE);
/*各种变量*/
int topTree = -1;
int topNum = -1;
int count = 0;
/*先把根节点入栈,以树根为基准开始遍历*/
stackTree[++topTree] = root;
/*当存放树结点的栈不空的时候说明还没遍历结束*/
while (topTree != -1)
{
/*将第一个元素弹出*/
struct TreeNode* temp = stackTree[topTree--];
/*这里是重点,每次都把根节点入数栈,所以根节点肯定是最下边,最后打印输入*/
/*而每次入树结点栈一定要按照先左后右,因为出树栈入数栈,相当于顺序颠倒了一下*/
/*最后的顺序就是左->右->根*/
if (temp != NULL)
{
stackNum[++topNum] = temp;
stackTree[++topTree] = temp->left;
stackTree[++topTree] = temp->right;
}
}
/*将数栈中元素加入结果数组*/
while (topNum != -1)
{
res[count++] = stackNum[topNum--]->val;
}
/*返回结果*/
*returnSize = count;
return res;
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版