在LeetCode上刷题不需要自己写输入输出,只需要写出函数的关键部分就行了,但是ACM及很多OJ都是需要编写完整的程序的,尤其是自己调试的时候,二叉树都需要自己生成,开始我都是用的笨方法,挨个节点连接起来,
pNode a, b, c, d, e, f, g, h, i, j, k, l;
l = new Node(13, NULL, NULL);
k = new Node(12, NULL, NULL);
j = new Node(11, NULL, NULL);
i = new Node(10, NULL, NULL);
h = new Node(9, NULL, NULL);
g = new Node(7, NULL, NULL);
f = new Node(6, l, NULL);
e = new Node(5, j, k);
d = new Node(4, h, i);
c = new Node(3, f, g);
b = new Node(2, d, e);
a = new Node(1, b, c);
delete a;
delete b;
delete c;
delete d;
delete e;
delete f;
delete g;
delete h;
delete i;
delete j;
delete k;
delete l;
这样写起来非常麻烦,《大话数据结构》里给出了一种递归生成二叉树的方法
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
struct Node
{
// Node()
// :data(0), left(NULL), right(NULL)
// {}
Node(char n = 0, Node *l = NULL, Node *r = NULL)
:data(n), left(l), right(r)
{}
char data;
Node * left;
Node * right;
};
typedef Node * pNode;
void creat_tree(pNode &T)
{
char n;
cin >> n;
if ('#' == n)
{
T = NULL;
}
else
{
T = new Node(n, NULL, NULL);
// T->data = n;
creat_tree(T->left);
creat_tree(T->right);
}
}
void level_traversal(Node * root)
{
queue<Node *> q;
q.push(root);
// cout << q.size() << endl;
while(q.size())
{
cout << q.front()->data << endl;
if (q.front()->left)
q.push(q.front()->left);
if (q.front()->right)
q.push(q.front()->right);
q.pop();
}
}
void post_traversal(Node * root)
{
if (NULL != root)
{
post_traversal(root->left);
post_traversal(root->right);
cout << root->data << endl;
}
}
int main()
{
freopen("in.txt", "r", stdin);
pNode a = NULL;
creat_tree(a);
// cout << a->data << endl;
post_traversal(a);
level_traversal(a);
/*in.txt
A
B
#
D
#
#
C
#
#*/
return 0;
}