[leet code ] 二叉树非递归前序 中序,后序遍历
2014-09-17 21:24
211 查看
//
// main.cpp
// binary tree preorder treversal
//
// Created by zhukunjie on 14-8-15.
// Copyright (c) 2014年 zhukunjie. All rights reserved.
//
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode * left;
TreeNode * right;
TreeNode(int x): val(x),left(nullptr),right(nullptr){}
};
//前序
vector<int> preorderTraversal(TreeNode* root)
{
vector<int>res;
stack<TreeNode*> tmp;
if(root==NULL) return res;
TreeNode *p=root;
if(p) tmp.push(p);
while (!tmp.empty()) {
p=tmp.top();
tmp.pop();
res.push_back(p->val);
if(p->right!=nullptr) tmp.push(p->right);
if(p->left!=nullptr) tmp.push(p->left);
}
return res;
}
//中序
vector<int> inorderTraversal(TreeNode *root) {
vector<int>res;
stack<TreeNode*> tmp;
if(root==NULL) return res;
TreeNode *p=root;
while (!tmp.empty()||p!=nullptr) {
if (p) {
tmp.push(p);
p=p->left;
}
else{
p=tmp.top();
tmp.pop();
res.push_back(p->val);
p=p->right;
}
}
return res;
}
//后序
vector<int> postorderTraversal(TreeNode *root) {
stack<TreeNode*> tmp;
vector<int> result;
TreeNode * Hasvisited;
if(root == NULL) return result;
while(root || !tmp.empty()){
while(root){
tmp.push(root);
root = root->left;
}
root = tmp.top();
if(root->right == NULL || Hasvisited == root->right){
result.push_back(root->val);
Hasvisited = root;
tmp.pop();
root = NULL;
}
else{
root = root->right;
}
}
return result;
}
int main(int argc, const char * argv[])
{
TreeNode * a1=new TreeNode(2);
TreeNode * a2=new TreeNode(3);
TreeNode * a3=new TreeNode(1);
a1->left=a2;
a2->left=a3;
inorderTraversal(a1);
std::cout << "Hello, World!\n";
return 0;
}
// main.cpp
// binary tree preorder treversal
//
// Created by zhukunjie on 14-8-15.
// Copyright (c) 2014年 zhukunjie. All rights reserved.
//
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode * left;
TreeNode * right;
TreeNode(int x): val(x),left(nullptr),right(nullptr){}
};
//前序
vector<int> preorderTraversal(TreeNode* root)
{
vector<int>res;
stack<TreeNode*> tmp;
if(root==NULL) return res;
TreeNode *p=root;
if(p) tmp.push(p);
while (!tmp.empty()) {
p=tmp.top();
tmp.pop();
res.push_back(p->val);
if(p->right!=nullptr) tmp.push(p->right);
if(p->left!=nullptr) tmp.push(p->left);
}
return res;
}
//中序
vector<int> inorderTraversal(TreeNode *root) {
vector<int>res;
stack<TreeNode*> tmp;
if(root==NULL) return res;
TreeNode *p=root;
while (!tmp.empty()||p!=nullptr) {
if (p) {
tmp.push(p);
p=p->left;
}
else{
p=tmp.top();
tmp.pop();
res.push_back(p->val);
p=p->right;
}
}
return res;
}
//后序
vector<int> postorderTraversal(TreeNode *root) {
stack<TreeNode*> tmp;
vector<int> result;
TreeNode * Hasvisited;
if(root == NULL) return result;
while(root || !tmp.empty()){
while(root){
tmp.push(root);
root = root->left;
}
root = tmp.top();
if(root->right == NULL || Hasvisited == root->right){
result.push_back(root->val);
Hasvisited = root;
tmp.pop();
root = NULL;
}
else{
root = root->right;
}
}
return result;
}
int main(int argc, const char * argv[])
{
TreeNode * a1=new TreeNode(2);
TreeNode * a2=new TreeNode(3);
TreeNode * a3=new TreeNode(1);
a1->left=a2;
a2->left=a3;
inorderTraversal(a1);
std::cout << "Hello, World!\n";
return 0;
}
相关文章推荐
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
- 二叉树的先序、中序、后序、层次遍历的递归和非递归解法
- 采用二叉链表结构实现二叉树,并以递归遍历思想实现二叉树的创建、二叉树的遍历(先序、中序、后序和层次遍历)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树先序,中序,后序遍历非递归实现
- 二叉树的建立以及前序、中序、后序遍历的递归和非递归实现
- Java实现二叉树的前序、中序、后序、层序遍历(递归方法)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树前序、中序、后序遍历(递归版、非递归版)
- 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树前序、中序、后序非递归遍历实现(C语言)
- 二叉树非递归实现先序,中序,后序,按层遍历
- 非递归实现二叉树的前序,中序,后序遍历打印
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 二叉树的遍历--用递归 和栈 实现 前序、中序、后序遍历
- 二叉树的先序-中序-后序遍历(一)-递归
- 用非递归实现二叉树的前序、中序、后序、层次遍历,用递归实现查找、统计个数、比较、求深度
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
- C语言二叉树常见操作详解【前序,中序,后序,层次遍历及非递归查找,统计个数,比较,求深度】
- 第6章 树和二叉树——递归方法先序、中序、后序遍历二叉链表表示的二叉树