二叉樹常見問題
阿新 • • 發佈:2018-11-02
1.兩顆二叉樹A和B,判斷B是不是A的子結構
/* 思路:1.在樹A中找到和B的根節點一樣的節點R 2.判斷樹A以R為根節點的子樹是不是包含和樹B一樣的結構 */ bool DoesTree1HaveTree2(BiTreeNode*T1,BiTreeNode*T2); bool HasSubtree(BiTreeNode*T1,BiTreeNode*T2) { bool result=false; if(T1&&T2) { if(T1->data==T2->data) result=DoesTree1HaveTree2(T1,T2); if(!result) result=HasSubtree(T1->lchild,T2); if(!result) result=HasSubtree(T1->rchild,T2); } return result; } //T1是否包含T2 bool DoesTree1HaveTree2(BiTreeNode*T1,BiTreeNode*T2) { if(T2==NULL) return true; if(T1==NULL) return false; if(T1->data !=T2->data) return false; return DoesTree1HaveTree2(T1->lchild,T2->lchild)&&DoesTree1HaveTree2(T1->rchild,T2->rchild); }
2.二叉樹的映象
void MirrorRecusively(BiTreeNode*T) { if((T==NULL)||(T->lchild==NULL&&T->rchild==NULL)) return; BiTreeNode *temp=T->lchild; T->lchild=T->rchild; T->rchild=temp; if(T->lchild) MirrorRecusively(T->lchild); if(T->rchild) MirrorRecusively(T->rchild); }
3.輸入一個整型陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷
bool VerifySquenceOfBST(int sequence[],int length) { if(sequence==NULL||length<=0) return false; int root=sequence[length-1]; //左子樹的節點小於根節點 int i=0; for(;i<length-1;++i) { if(sequence[i]>root) break; } //右子樹的節點大於根節點 int j=i; for(;j<length-1;++j) { if(sequence[j]<root) return false; } bool left=true; if(i>0) left=VerifySquenceOfBST(sequence,i); bool right=true; if(i<length-1) right=VerifySquenceOfBST(sequence+i,length-i-1); return (left&&right); }