#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode *left, *right;
};
// 递归遍历
void recursion(TreeNode *root) {
if (root == NULL)
return ;
//前序
//cout << root->val << endl;
recursion(root->left);
//中序
cout << root->val << endl;
recursion(root->right);
//后序
//cout << root->val << endl;
}
// 非递归前序遍历
void pre_print(TreeNode* root) {
if (root == NULL)
return;
std::stack<TreeNode*> treeStack;
while(root != NULL || !treeStack.empty()) {
// left node
while(root != NULL) {
cout << root->val << endl;
treeStack.push(root);
root = root->left;
}
root = treeStack.top();
treeStack.pop();
// right node
root = root->right;
}
}
// 非递归中序遍历
void mid_print(TreeNode* root) {
if (root == NULL)
return;
std::stack<TreeNode*> treeStack;
while(root != NULL || !treeStack.empty()) {
// left node
while(root != NULL) {
treeStack.push(root);
root = root->left;
}
root = treeStack.top();
treeStack.pop();
cout << root->val << endl;
// right node
root = root->right;
}
}
// 非递归后序遍历
void post_print(TreeNode* root) {
if (root == NULL)
return;
std::stack<TreeNode*> treeStack;
TreeNode* last = root;
while(root != NULL || !treeStack.empty()) {
// left node
while(root != NULL) {
treeStack.push(root);
root = root->left;
}
root = treeStack.top();
if (root->right == NULL || root->right == last) {
last = root;
treeStack.pop();
cout << root->val << endl;
root = NULL;
}
else {
// right node
root = root->right;
}
}
}
void Convert2List(TreeNode* root) {
if (root == NULL)
return root;
std::stack<TreeNode*> treeStack;
TreeNode* listHead = NULL, *last = NULL;
while(root != NULL || !treeStack.empty()) {
while(root != NULL) {
treeStack.push(root);
root = root->left;
}
root = treeStack.top();
treeStack.pop();
if (listHead == NULL) {
listHead = root;
root->left = NULL;
}
else {
last->right = root;
root->left = last;
}
last = root;
root = root->right;
}
for(root = listHead; root != NULL; root = root->right)
cout << root->val << endl;
}
TreeNode* creatNode(int value) {
TreeNode* p = new TreeNode();
p->val = value;
p->left = p->right = NULL;
return p;
}
TreeNode* creatTree() {
TreeNode *root = NULL;
root = creatNode(10);
root->left = creatNode(6);
root->right = creatNode(14);
root->left->left = creatNode(4);
root->left->right = creatNode(8);
root->right->left = creatNode(12);
root->right->right = creatNode(16);
return root;
}
int main() {
TreeNode *root = creatTree();
recursion(root);
cout << endl;
pre_print(root);
cout << endl;
root = creatTree();
mid_print(root);
cout << endl;
root = creatTree();
post_print(root);
cout << endl;
root = creatTree();
Convert2List(root);
}
二叉树的前 中 后序遍历,递归和非递归实现以及转换成双向链表
最新推荐文章于 2022-01-05 22:47:43 发布