输入: [1,null,2,3]
输出:1,3,2
二叉树的遍历在数据结构中是非常基本的算法.如下代码包含的是二叉树的前序遍历、中序遍历、后序遍历三种算法。
前序遍历顺序:根节点->左子树->右子树
中序遍历顺序:左子树->根节点->右子树
后序遍历顺序:左子树->右子树->根节点
代码如下所示:
#include <iostream>
#include <vector>
#include <sstream> //getline 包含在 sstream 中,要include!
using namespace std;
#define NULL_STR "null"
const char delimiter = ',';
const char kuohao0 = '[';
const char kuohao1 = ']';
int isEnd = 0;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
class Solution {
public:
bool getStdinStr(string &mstr)
{
mstr.clear();
char c = ' ';
//char s1[2] = {c,0};
string s = "";
int sNum = 0;
if(isEnd)
return false;
while(1)
{
cin>>c;
//cout << c << endl;
if(c == delimiter)
break;
if(c == kuohao0)
continue;
if(c==kuohao1)
{
isEnd = 1;
break;
}
s += " ";
s[sNum++] = c;
}
if(s == NULL_STR)
return false;
mstr = s;
return true;
//fflush(stdin);
}
// 根据前序构建一个二叉树
TreeNode* preCreatBiTree(TreeNode *tree){
string c;
int sint;
//getStdinStr(c);
//if(c.compare(DELIMITER) == 0)
if(!getStdinStr(c)){
return NULL;
}
else{
cout << c << endl;
sscanf(c.c_str(),"%d",&sint);
tree = new TreeNode(0);
tree->val = sint;
tree->left = preCreatBiTree(tree->left);
tree->right = preCreatBiTree(tree->right);
}
return tree;
}
// 前序遍历二叉树
void preorderTraversal(TreeNode *root){
if(root == NULL)
return;
cout << root->val << endl;
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 中序遍历二叉树
void inorderTraversal(TreeNode* root) {
if(root == NULL)
return;
inorderTraversal(root->left);
cout << root->val << endl;
inorderTraversal(root->right);
}
// 后续遍历二叉树
void backorderTraversal(TreeNode *root){
if(root == NULL)
return;
backorderTraversal(root->left);
backorderTraversal(root->right);
cout << root->val << endl;
}
};
int main(void)
{
Solution ms;
struct TreeNode *myTree;
myTree = NULL;
cout << "创建树:" << endl;
cout << "输入:"<<endl; //[1,null,2,3]
myTree = ms.preCreatBiTree(myTree);
cout << "前序遍历该树" << endl;
ms.preorderTraversal(myTree);
cout << "中序遍历该树" << endl;
ms.inorderTraversal(myTree);
cout << "后序遍历该树" << endl;
ms.backorderTraversal(myTree);
system("pause");
return 1;
}