1. 程式人生 > >二叉樹面試題(一)---判斷兩個二叉樹結構是否相同

二叉樹面試題(一)---判斷兩個二叉樹結構是否相同

一、首先這個問題是判斷二叉樹的結構是否相同,所以這就和二叉樹的資料的值無關。只需要判斷結構;判斷兩個二叉樹的結構是否相同很簡單。
採用遞迴的思想:
(1)如果兩棵二叉樹都為空,返回真
(2)如果兩棵二叉樹一棵為空,另一棵不為空,返回假
(3)如果兩棵二叉樹都不為空,則遞迴判斷其對應的左子樹和右子樹結構是否相同,如果都相同返回真,其他返回假
二、程式碼實現

#include<iostream>
using namespace std;
#include<assert.h>
template<class T>
struct TreeNode
{
    TreeNode( const
T& data=T()) :_data(data) ,_left(NULL) ,_right(NULL) {} int _data; TreeNode<T>* _left; TreeNode<T>* _right; }; template<class T> class BinaryTree { typedef TreeNode<T> Node; public: BinaryTree()//無參建構函式 :_root(NULL) {} BinaryTree(const
T* arr,int sz,const T invalid)//有參建構函式 { assert(arr); int index=0;//陣列中的位置 _root=BuildTree(arr,sz,invalid,index); } bool SameTree(BinaryTree<T>& b) { return _SameTree(_root,b._root); } protected: Node* BuildTree(const T* arr,int sz,const T invalid,int
index)//前序建樹 { if (index<sz && arr[index]!=invalid)//沒有走完陣列,且不是非法值 { Node* root=new Node(arr[index]); root->_left=BuildTree(arr,sz,invalid,++index); root->_right=BuildTree(arr,sz,invalid,++index); return root; } return NULL; } bool _SameTree(Node* root1,Node* root2) { if (root1==NULL&&root2==NULL)//兩個樹都為空,則結構相同 { return true; } else if (root1==NULL||root2==NULL)//一個為空一個不為空 { return false; } else//兩個都不為空 { bool ret1=_SameTree(root1->_left,root2->_left);//檢查左子樹結構 bool ret2=_SameTree(root1->_right,root2->_right);//檢查有子樹結構 return (ret1&&ret2);//左右子樹的結構必須都相同 } } private: Node* _root; };

測試程式碼:

void Test()
{
    int arr1[] = {1, 2, 3, '#', '#', 4, '#' , '#', 5, 6};
    int sz1=sizeof(arr1)/sizeof(arr1[0]);
    BinaryTree<int>  bt1(arr1,sz1,'#');//呼叫帶有引數的建構函式

    int arr2[] = {1,2,'#',3,'#','#',4,5,'#',6,'#',7,'#','#',8};
    int sz2=sizeof(arr2)/sizeof(arr2[0]);
    BinaryTree<int>  bt2(arr2,sz2,'#');//呼叫帶有引數的建構函式
    cout<<"bt1和bt2結構是否相同:"<<bt1.SameTree(bt2)<<endl;

    int arr3[] = {1, 2, 3, '#', '#', 4, '#' , '#', 5, 6};
    int sz3=sizeof(arr3)/sizeof(arr3[0]);
    BinaryTree<int>  bt3(arr3,sz3,'#');//呼叫帶有引數的建構函式
    cout<<"bt1和bt3結構是否相同:"<<bt1.SameTree(bt3)<<endl;


}
int main()
{   
    Test();
    return 0;
}

三、執行結果
這裡寫圖片描述

O(∩_∩)O