#include <iostream>
#include <cstdio>
#include <queue>
#include <stack>
#include <cstring>
using namespace std;
typedef struct NODE{
NODE()
:key('0'), lchild(NULL), rchild(NULL){}
char key;
NODE *lchild;
NODE *rchild;
} Node;
void pre_mid(Node *&node, int len, char *pre, char *mid){
if(len <= 0) return;
node = new Node();
node->key = *pre;
char *pm = strchr(mid, *pre);
int l_len = pm - mid;
int r_len = len - l_len - 1;
pre_mid(node->lchild, l_len, pre+1, mid);
pre_mid(node->rchild, r_len, pre+l_len+1, pm+1);
}
void mid_after(Node *&node, int len, char *mid, char *after){
if(len <= 0) return;
node = new Node();
node->key = *(after+len-1);
char *pm = strchr(mid, node->key);
int l_len = pm - mid;
int r_len = len - l_len - 1;
mid_after(node->lchild, l_len, mid, after);
mid_after(node->rchild, r_len, pm+1, after+l_len);
}
void preorder(Node *node){
if(node == NULL) return;
stack<Node *> st;
st.push(node);
while(!st.empty()){
Node *cur = st.top();
st.pop();
cout << cur->key;
if(cur->rchild)
st.push(cur->rchild);
if(cur->lchild)
st.push(cur->lchild);
}
cout << endl;
}
void midorder(Node *node){
if(node == NULL) return;
stack<Node *> st;
Node *cur = node;
while(cur || !st.empty()){
while(cur){
st.push(cur);
cur = cur->lchild;
}
if(!st.empty()){
cur = st.top();
st.pop();
cout << cur->key;
cur = cur->rchild;
}
}
cout << endl;
}
typedef struct POINT{
POINT():node(NULL), flag(false){}
POINT(Node *_node = NULL, int _flag = false)
:node(_node), flag(_flag)
{}
Node *node;
bool flag;
} Point;
void afterorder(Node *node){
if(node == NULL) return;
stack<Point> st;
st.push(Point(node, false));
while(!st.empty()){
Point &cur = st.top();
if(cur.flag){
cout << cur.node->key;
st.pop();
continue;
}
if(cur.node->rchild)
st.push(Point(cur.node->rchild, false));
if(cur.node->lchild)
st.push(Point(cur.node->lchild, false));
cur.flag = true;
}
cout << endl;
}
int main()
{
Node *root = NULL;
char *pre = "DBACEGF";
char *mid = "ABCDEFG";
char *after = "ACBFGED";
pre_mid(root, strlen(pre), pre, mid);
mid_after(root, strlen(pre), mid, after);
preorder(root);
midorder(root);
afterorder(root);
return 0;
}
二叉树给出两种遍历序列(含中序遍历)创建一颗先序遍历二叉树
最新推荐文章于 2022-10-18 14:52:44 发布