把博客当成朋友圈
超认真
碎碎念
是树这块的作业题
有几题之前就写过,但当时好像是用非递归写的,写的挺难看
现在试试递归写法
代码
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
typedef struct TNode* BinTree;
struct TNode
{
char data;
BinTree Left;
BinTree Right;
};
void CreatTree(BinTree &T);
void PrintTree(BinTree T);
stack<char>s;
int main()
{
string str;
while (cin>>str) {
for (int i = str.size()-1; i >=0 ; i--)
s.push(str[i]);
BinTree T = NULL;
CreatTree(T);
PrintTree(T);
cout << endl;
}
return 0;
}
void PrintTree(BinTree T)
{
if (T) {
PrintTree(T->Left);
cout << T->data << " ";
PrintTree(T->Right);
}
}
void CreatTree(BinTree &T)
{
char c;
c = s.top();
s.pop();
if (c == '#') {
T = NULL;
return;
}
T = new struct TNode;
T->data = c;
CreatTree(T->Left);
CreatTree(T->Right);
}
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
typedef struct TNode* BinTree;
struct TNode
{
char data;
BinTree Left;
BinTree Right;
};
void BuildTree(BinTree &T,int b,int e);
int GetHeight(BinTree BT);
char pre[100], in[100];
int n;
int pos = 0;//pre数组移动位置的
int main()
{
cin >> n;
for (int i = 0; i < n; i++) cin >> pre[i];
for (int i = 0; i < n; i++) cin >> in[i];
BinTree T=NULL;
BuildTree(T,0,n-1);
int length = GetHeight(T);
cout << length;
}
void BuildTree(BinTree &T,int b,int e)
{
char root = pre[pos];
int p=-1;
for (int i=b; i <= e; i++)//这里注意是等于,因为e是最后一个元素的位置
if (root == in[i]) {
p = i;
break;
}
if (p == -1) {//找不到就说明这个节点不在所递归中序遍历的区间
T = NULL;
return;
}
pos++;//找到再后移
T = new struct TNode;
T->data = root;
BuildTree(T->Left, b,p-1);
BuildTree(T->Right, p + 1, e);
}
int GetHeight(BinTree BT)
{
if (BT == NULL) return 0;
else return max(GetHeight(BT->Left), GetHeight(BT->Right)) + 1;
}
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct TNode* BinTree;
struct tree
{
int pos;
int pleft;
int pright;
};
struct TNode
{
struct tree data;
BinTree left;
BinTree right;
};
struct tree BT[20];
void BuildTree(BinTree& T,int proot);
void Print_Leaf(BinTree T);
int main()
{
int n;
char l, r;
cin >> n;
int find_root[20] = { 0 };//找根节点的,怎么找根节点是关键,其他的不难
for (int i = 0; i < n; i++)
{
BT[i].pos = i;
cin >> l >> r;
if (l == '-') BT[i].pleft = -1;
else {
BT[i].pleft = l - '0';
find_root[l - '0'] = 1;
}
if (r == '-') BT[i].pright = -1;
else {
BT[i].pright = r - '0';
find_root[r - '0'] = 1;
}
}
int proot=-1;
for (int i = 0; i < n; i++)
if (find_root[i] == 0) {
proot = i;
break;
}
BinTree T;
BuildTree(T,proot);
Print_Leaf(T);
}
void Print_Leaf(BinTree T)
{
int sign = 0;
queue<struct tree>q;
q.push(T->data);
while (!q.empty())
{
struct tree temp = q.front();
if (temp.pleft == -1 && temp.pright == -1) {
if(sign==1) cout << " ";
cout << temp.pos;
sign = 1;
}
q.pop();
if(temp.pleft!=-1)q.push(BT[temp.pleft]);
if(temp.pright!=-1)q.push(BT[temp.pright]);
}
}
void BuildTree(BinTree& T,int proot)
{
if (proot == -1) {
T = NULL;
return;
}
T = new struct TNode;
T->data = BT[proot];
BuildTree(T->left, BT[proot].pleft);
BuildTree(T->right, BT[proot].pright);
}
感觉用递归建树大有长进,赶紧记下来(傻笑~