和树有关的题
1004、1020、1086、1043、1066、1123、1094、1053、1079、1090、1106、1115、1119、1064、1099、1110、1102、1138、1143、1151
建树方式
1. 非二叉树用vector保存每一个非叶节点的孩子
例如:A1004
vector<int> tree [102];
int m, n;//总结点数和非叶结点数
int node, num;
int data;
cin >> m >> n;
for (int i = 0; i < n; i++)
{
cin >> node >> num;//父节点和父节点的孩子个数
for (int j = 0; j < num; j++)
{
cin >> data;
tree[node].push_back(data);//将孩子信息放入对应的vector中
}
}
2. 二叉树左右指针之给定后序和中序建树
例如:A1020
typedef struct BiTNode {
int data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
BiTree CreateNode(int postorder[], int inorder[], int n)
{
BiTree pnode = new BiTNode;
if (n == 0)//空树
{
pnode = NULL;
}
else
{
//后序序列的最后一个元素是根节点
pnode->data = postorder[n - 1];
//cout << pnode->data << endl;
int root_in_in;
//得到根结点在中序序列中的位置
root_in_in = find(inorder, n, postorder[n - 1]);
int r_p[31], r_i[31], l_p[31], l_i[31];
int r_num = 0, l_num = 0;
//得到左子树的后序序列和中序序列
for (l_num = 0; l_num < root_in_in; l_num++)
{
l_p[l_num] = postorder[l_num];
l_i[l_num] = inorder[l_num];
}
//得到右子树的后序序列和中序序列
int i;
for (r_num = 0, i = root_in_in; i < n - 1; i++, r_num++)
r_p[r_num] = postorder[i];
for (r_num = 0, i = root_in_in + 1; i < n; i++, r_num++)
r_i[r_num] = inorder[i];
pnode->lchild = CreateNode(l_p, l_i, l_num);
pnode->rchild = CreateNode(r_p, r_i, r_num);
}
return pnode;
}
3. 二叉树左右指针之给定先序和中序建树
例如:1086
Tree* createTree(int preL, int preR, int inL, int inR)//(0,n-1,0,n-1)
{
if (inL > inR)
return NULL;
Tree* t = new Tree;
t->data = preorder[preL];
int i;
for (i = inL; i < inR; ++i)
if (inorder[i] == preorder[preL])
break;
int numleft = i - inL;
t->lchild = createTree(preL + 1, preL + numleft, inL, i - 1);
t->rchild = createTree(preL + numleft + 1, preR, i + 1, inR);
return t;
}
2和3分别使用了不同的方法,其实本质是相同的,都是提取出根结点,然后将结点分为左子树和右子树,再进行递归
4. 建立二叉搜索树
例如:1043
typedef struct node
{
int data;
struct node* lchild, * rchild;
}node;
node* build(node* root, int v)
{
if (root == NULL)
{
root = new node;