面試題 18
阿新 • • 發佈:2019-01-24
1 題目描述
輸入兩棵二叉樹 A 和 B,判斷 B 是不是 A 的子結構。
2 解法描述
- 遍歷二叉樹 A 找到與二叉樹 B 根節點相同的 A 的子樹 a 。
遍歷子樹 a 和 二叉樹 B ,判斷 a 和 B 是否存在一樣結構的子樹。
3 C 語言實現
#include<stdio.h>
// Tree
typedef char ElemType;
typedef struct node{
ElemType data;
struct node *lchild,*rchild;
}TNode,*Tree;
//建立二叉樹
TNode* createTree(){
ElemType data ;
scanf("%c",&data);
TNode* node;
if(data=='0') return NULL;
node=(TNode*)malloc(sizeof(TNode));
node->data=data;
node->lchild=createTree();
node->rchild=createTree();
return node;
}
/*
分兩步解決問題
第一步,在待查二叉樹 A 中,找到與 B 樹根節點一樣的節點 a
第二步,判斷 a 節點下面的子樹是否含有跟 B 一樣的子樹。
*/
int hasSubRoot(Tree tree1,Tree tree2){
int result=0;
if(tree1!=NULL&&tree2!=NULL){
if(tree1->data==tree2->data){
//進行第二步
result=tree1HasTree2(tree1,tree2);
}
if(!result){
//遍歷左孩子
result=hasSubRoot(tree1->lchild,tree2);
}
if (!result){
//遍歷右孩子
result=hasSubRoot(tree1->rchild,tree2);
}
}
return result;
}
//判斷 a 節點下面的子樹是否含有跟 B 一樣的子樹
int tree1HasTree2(TNode *tree1node,TNode *tree2node){
if(tree2node==NULL) return 1;
if(tree1node==NULL) return 0;
if(tree1node->data!=tree2node->data) return 0;
return(tree1HasTree2(tree1node->lchild,tree2node->lchild)&&
tree1HasTree2(tree1node->rchild,tree2node->rchild));
}
void main(){
Tree tree1;
tree1=NULL;
printf("%s:","請輸入二叉樹 Tree1 的元素");
tree1=createTree();
printf("\n");
getchar();
Tree tree2;
tree2=NULL;
printf("%s:","請輸入二叉樹 Tree2 的元素");
tree2=createTree();
if(hasSubRoot(tree1,tree2)){
printf("%s:","Tree1 是 Tree2 的一部分");
}else{
printf("%s:","Tree1 不是 Tree2 的一部分");
}
}
4 心得體會
- 關於二叉樹的問題,要思考遞迴方式解決。