本文参考该作者文章当作编程笔记: 作者:Hawstein 出处:http://hawstein.com/posts/ctci-solutions-contents.html
Q:
写程序在一棵二叉树中找到两个结点的第一个共同祖先。不允许存储额外的结点。注意: 这里不特指二叉查找树。
思路:
首先,理解题义:不允许储存额外的结点。指的是,2叉树结点中除了左右孩子结点不应该有别的结点。
然后,根节点一定是两个结点的祖先。那么我们只要向下遍历根节点的孩子,直到找到符合条件的最后一个祖先节点即可。
CODE:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 9 /*树的结点数*/ 4 #define key(A) (A) 5 #define less(A,B) (A<B) 6 typedef struct node 7 { 8 char item; 9 struct node *l,*r; 10 }tree_node; 11 /*head为存储树的数组栈,g_anc为两个节点的共同祖先*/ 12 tree_node *head,*g_anc; 13 int C; /*C为数组下标*/ 14 /*初始化树*/ 15 void treeInit(tree_node **head) 16 { 17 *head=(tree_node *)calloc(N,sizeof(tree_node)); 18 g_anc=NULL; 19 C=0; 20 } 21 /*将树的结点压入栈中*/ 22 tree_node * treePush(char item) 23 { 24 head[C].item=item; 25 head[C].l=NULL; 26 head[C].r=NULL; 27 return head+C++; /*返回该节点的地址,并使数组下标加1*/ 28 } 29 /*插入树的节点,按照2叉查找树的形式*/ 30 void treeInsert(tree_node *node,char item) 31 { 32 if(node->item=='