记得不是很清楚,很原题会有些出入
(1)要求输入先序序列,构建链式二叉树,比如输入字符串ABC##D#E##F##,构建如上图
二叉树.
(2)输出二叉树中序遍历的结果.
(3)输入u,v,输出u,v的共同父节点.
example
input:
ABC##D#E##F##
B E
output:
CBDEAF
B
_______________________________________
首先我们需要定义结构体
typedef struct node {
char data;
struct node *lchild, *rchild;
} Tree;
然后写构建二叉树的函数,用递归非常方便
char* createTree(Tree** p, char *ptr) {
Tree *t = (Tree*) malloc(sizeof(Tree));
t->data = *ptr;
*p = t;
if (*(++ptr) == '#')
t->lchild = 0;
else
ptr = createTree(&t->lchild, ptr);
if (*(++ptr) == '#')
t->rchild = 0;
else
ptr = createTree(&t->rchild, ptr);
return ptr;
}
中序遍历就比较简单了
void InOrder(Tree *t) {
if (t->lchild)
InOrder(t->lchild);
putchar(t->data);
if (t->rchild)
InOrder(t->rchild);
}
最后一题有点难度,实际上用后续遍历就可以解决了
int findCommonParent(Tree *t, char u, char v) {
int flag = 0, lflag=0, rflag=0;
if (t->lchild)
lflag = findCommonParent(t->lchild, u, v);
if (t->rchild)
rflag = findCommonParent(t->rchild, u, v);
if (t->data == u)
flag |= 1;
if (t->data == v)
flag |= 1 << 1;
flag |= lflag;
flag |= rflag;
if (flag == (1 | 1 << 1)) {
printf("%c\n", t->data);
return 1 << 2;
}
if (flag & 1 << 2)
return 1 << 2;
return flag;
}
如果没弄懂,看下面的图,再结合代码,其实不复杂
最后是主函数,这里偷懒了,没用scanf,直接写死在代码中了
int main() {
char input[] = "ABC##D#E##F##", *ptr, u, v;
Tree *root;
ptr = input;
createTree(&root, input);
InOrder(root);
printf("\n");
findCommonParent(root, 'B', 'E');
}
完整代码以及其他题目:https://download.csdn.net/download/chunlaizuohuayiluo/11058904