在中国大学MOOC听了武汉大学—李春葆老师的数据结构课,来写个笔记。
(如有侵权,联系博主,立删。)
括号表示法字符串构造二叉链:
遍历所给的字符串,当一个元素后面紧跟着一个左括号"(",便代表着它有孩子结点,将这个元素入栈,去构造它的左子树和右子树,遇到",",表示右子树的开始,遇到")",表示一棵子树的结束。一个父亲结点的子树构造完成,便将其出栈。直到所给字符串遍历结束。
Code
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
struct Node
{
char data;
Node* lchild,*rchild;
};
void create_tree(Node*& root,string & str) {//二叉树括号表示串 创建二叉链 利用栈
root = NULL;
stack<Node*> S;//用了STL,偷懒
Node* p;
int k=0;
//偷了个小懒,直接用str[i],没写char ch=str[i]
for (int i = 0; i < str.length(); i++) {
switch (str[i])
{
case '(':S.push(p); k = 1; break;
case ')':S.pop(); break;
case ',':k = 2; break;
default: {
p = new Node;
p->data = str[i];
p->lchild = p->rchild = NULL;
if (root == NULL) root = p;
else {
switch (k)
{
case 1:S.top()->lchild = p; break;
case 2:S.top()->rchild = p; break;
}
}
}
break;
}
}
}
void xian(Node*& root) {//先序遍历二叉树
if (root != NULL) {
cout << root->data;
xian(root->lchild);
xian(root->rchild);
}
}
void zhong(Node*& root) {//中序遍历二叉树
if (root != NULL) {
zhong(root->lchild);
cout << root->data;
zhong(root->rchild);
}
}
void hou(Node*& root) {//后序遍历二叉树
if (root != NULL) {
hou(root->lchild);
hou(root->rchild);
cout << root->data;
}
}
int main() {
Node* root;
string s = "A(B(D(,G)),C(E,F))";
create_tree(root,s);
cout << "先序遍历:";
xian(root);
cout << endl;
cout << "中序遍历:";
zhong(root);
cout << endl;
cout << "后序遍历:";
hou(root);
cout << endl;
}
Output
我自己另外还写了个先序输入创建二叉树的
Code
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
struct Node
{
char data;
Node* lchild,*rchild;
};
void create_tree(Node*& root) {//先序输入建立二叉树 //例:A B D # # E # # C F # # G # #
char x;
cin >> x;
if(x!='#')//判断到达叶子结点
{
root = new Node;
root->data = x;
create_tree(root->lchild);
create_tree(root->rchild);
}
else root = NULL;
}
void xian(Node*& root) {//先序遍历二叉树
if (root != NULL) {
cout << root->data;
xian(root->lchild);
xian(root->rchild);
}
}
void zhong(Node*& root) {//中序遍历二叉树
if (root != NULL) {
zhong(root->lchild);
cout << root->data;
zhong(root->rchild);
}
}
void hou(Node*& root) {//后序遍历二叉树
if (root != NULL) {
hou(root->lchild);
hou(root->rchild);
cout << root->data;
}
}
int main() {
Node* root;
cout << "先序输入: ";
create_tree(root);//先序输入建立二叉树
cout << "先序遍历:";
xian(root);
cout << endl;
cout << "中序遍历:";
zhong(root);
cout << endl;
cout << "后序遍历:";
hou(root);
cout << endl;
}