1. 程式人生 > >面試題 18

面試題 18

1 題目描述

輸入兩棵二叉樹 A 和 B,判斷 B 是不是 A 的子結構。

2 解法描述

  1. 遍歷二叉樹 A 找到與二叉樹 B 根節點相同的 A 的子樹 a 。
  2. 遍歷子樹 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 心得體會

  1. 關於二叉樹的問題,要思考遞迴方式解決。