二叉樹面試題(一)---判斷兩個二叉樹結構是否相同
阿新 • • 發佈:2018-12-30
一、首先這個問題是判斷二叉樹的結構是否相同,所以這就和二叉樹的資料的值無關。只需要判斷結構;判斷兩個二叉樹的結構是否相同很簡單。
採用遞迴的思想:
(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