欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

題目描述:

站在用戶的角度思考問題,與客戶深入溝通,找到相城網(wǎng)站設計與相城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站建設、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋相城地區(qū)。

題目:二叉樹的結點定義如下:

struct TreeNode

{

       int m_nValue;

       TreeNode* m_pLeft;

       TreeNode* m_pRight;

};

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

例如,下圖中的兩棵樹A和B,由于A中有一部分子樹的結構和B是一樣的,因此B就是A的子結構。

                1                                                8
              /    \                                           /  \
             8      7                                          9    2
           /    \
          9       2
                /  \
               4    7

要查找樹A中是否存在和樹B結構一樣的子樹,我們可以分為兩步:第一步在樹A中找到和B的根結點的值一樣的結點N,第二步再判斷樹A中以N為根結點的子樹是不是包括和樹B一樣的結構。

第一步在樹A中查找與根結點的值一樣的結點。這實際上就是樹的遍歷。

第二步判斷以樹A中以N為根結點的子樹是不是和樹B具有相同的結構。同樣,我們也可以用遞歸的思路來考慮:如果結點N的值和樹B的根結點不相同,則以N為根結點的子樹和樹B肯定不具有相同的結點;如果他們的值相同,則遞歸地判斷他們的各自的左右結點的值是不是相同。遞歸的終止條件是我們到達了樹A或者樹B的葉結點。

#include<iostream>
#include<stack>
using namespace std;
struct BinaryTreeNode
{
	int data;
	BinaryTreeNode* left;
	BinaryTreeNode* right;
	BinaryTreeNode(int x)
		:data(x)
		, left(NULL)
		, right(NULL)
	{}
};
class BinaryTree
{
protected:
	BinaryTreeNode* _root;
	BinaryTreeNode* _CreateBinaryTree(int* arr, int& index, int size)
	{
		BinaryTreeNode* root = NULL;
		if (index<size&&arr[index] != '#')
		{
			root = new BinaryTreeNode(arr[index]);
			root->left = _CreateBinaryTree(arr, ++index, size);
			root->right = _CreateBinaryTree(arr, ++index, size);
		}
		return root;
	}
	bool CommonRoot(BinaryTreeNode* father, BinaryTreeNode* child)
	{
		bool ret = false;
		if (father->data == child->data)
		{
			ret=HaveSub(father, child);
		}
		if (!ret&&father->left != NULL)
			ret=CommonRoot(father->left, child);
		if (!ret&&father->right != NULL)
			ret=CommonRoot(father->right, child);
		return ret;
	}
	bool HaveSub(BinaryTreeNode* father, BinaryTreeNode* child)
	{
		if (child == NULL)//子樹為空
			return true;
		if (father == NULL)//子樹為空,父樹不為空
			return false;
		if (father->data != child->data)
			return false;
		//如果他們的值相同,則遞歸地判斷他們的各自的左右結點的值是不是相同。
		//遞歸的終止條件是我們到達了父樹或者子樹的葉結點
		return HaveSub(father->left, child->left) && HaveSub(father->right, child->right);
	}
public:
	BinaryTree()
		:_root(NULL)
	{}
	BinaryTree(int *arr, int size)
	{
		int index = 0;
		_root = _CreateBinaryTree(arr, index, size);
	}
	void PreOrder_Non()
	{
		if (_root == NULL)
			return;
		BinaryTreeNode* cur = _root;
		stack<BinaryTreeNode*> s;
		s.push(_root);
		while (!s.empty())
		{
			cur = s.top();
			printf("%d ", cur->data);
			s.pop();
			if (cur->right)
				s.push(cur->right);
			if (cur->left)
				s.push(cur->left);
		}
		cout << endl;
	}
	void InOrder_Non()
	{
		if (_root == NULL)
			return;
		stack<BinaryTreeNode*> s;
		BinaryTreeNode* cur = _root;
		while (cur || !s.empty())
		{
			while (cur)
			{
				s.push(cur);
				cur = cur->left;
			}
			if (!s.empty())
			{
				cout << s.top()->data << " ";
				cur = s.top()->right;
				s.pop();
			}
		}
		cout << endl;
	}
	void PostOrder_Non()
	{
		if (_root == NULL)
			return;
		stack<BinaryTreeNode*> s;
		BinaryTreeNode* cur = _root;
		BinaryTreeNode* prev = NULL;
		BinaryTreeNode* top = NULL;
		while (cur || !s.empty())
		{
			while (cur)
			{
				s.push(cur);
				cur = cur->left;
			}
			top = s.top();
			if (top->right == NULL || top->right == prev)
			{
				cout << top->data << " ";
				s.pop();
				prev = top;
			}
			else
			{
				cur = top->right;
			}
		}
		cout << endl;
	}
	bool IsSub(BinaryTree& bt)
	{
		if ((_root == NULL&&bt._root != NULL) || (_root != NULL&&bt._root == NULL))
			return false;
		if (_root == NULL&&bt._root == NULL)
			return true;
		return CommonRoot(_root, bt._root);
	}
};


void Test1()
{
	/*int arr1[] = { 1, 8, 9, '#', '#', 2, 4, '#', '#', 7, '#', '#', 7 };
	int arr2[] = { 8, 9, '#', '#', 2 };
	BinaryTree b1(arr1, sizeof(arr1) / sizeof(arr1[0]));
	BinaryTree b2(arr2, sizeof(arr2) / sizeof(arr2[0]));
	b1.InOrder_Non();
	b2.InOrder_Non();
	//1
	cout << b1.IsSub(b2) << endl;*/
	int arr1[] = { 1, 8, 9, '#', '#', 8, 4, '#', '#', 7, '#', '#', 7 };
	int arr2[] = { 8, 4, '#', '#', 7 };
	BinaryTree b1(arr1, sizeof(arr1) / sizeof(arr1[0]));
	BinaryTree b2(arr2, sizeof(arr2) / sizeof(arr2[0]));
	b1.InOrder_Non();
	b2.InOrder_Non();
	//0
	cout << b1.IsSub(b2) << endl;//當子樹不相等時,可繼續(xù)向下重新尋找相同的根節(jié)點
	int arr3[] = { 2, 3, '#', '#', 6 };
	BinaryTree b3(arr3, sizeof(arr3) / sizeof(arr3[0]));
	//0
	cout << b1.IsSub(b3) << endl;
	
}
#include"Tree.h"
int main()
{
	Test1();
	system("pause");
	return 0;
}

注:我們一定要注意邊界條件的檢查,即檢查空指針。當父樹或子樹為空的時候,定義相應的輸出。如果沒有檢查并做相應的處理,程序非常容易崩潰。

網(wǎng)頁標題:輸入兩棵二叉樹A和B,判斷樹B是不是A的子結構
URL鏈接:http://aaarwkj.com/article10/peepgo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化響應式網(wǎng)站、網(wǎng)站內鏈、App開發(fā)關鍵詞優(yōu)化網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
天堂社区人妻在线亚洲| 一本之道高清久久久首页| 亚洲欧美日韩伦理一区| 美女午夜精品国产福利| 国产精品毛片在线看不卡| 男人午夜福利视频在线观看| 天堂av免费资源在线观看| 日韩一级片精品视频在线| 亚洲伦理在线一区二区| 欧美日韩亚洲综合在线| 日本韩国一级黄色免费| 欧美欧美欧美欧美一区| 欧美大尺度影片在线观看| 日本成人大片在线观看| 国产精品午夜福利天堂| 亚洲av综合色区一区| 人妻熟妇av在线一区二区三区| 密臀av一区二区三区| 日本黄色录像在线观看| 在线看电影亚洲一区| 亚洲国产精品一区二区电影| 久久国产精品人妻av| 欧美黄片在线播放视频| 亚洲精品日韩国产av| 日本欧美一区中文字幕| 日韩欧美精品久久黄| 国产精品久久久久精品三级下载 | 亚洲一区二区三区熟女av| 亚洲综合色一区二区三区小说| av在线免费观看青青草原| 日本的黄色录像一级带| 在线观看精品日本一区二| 在线日韩观看免费av| 成人中文字幕日韩电影| 97在线亚洲欧美视频| 亚洲午夜精品毛片成人| 欧美夫妻成人性生活视频| 精品国产一区二区日韩91| 日韩中文字幕视频一区| 熟妇人妻中文字幕在线| 少妇肥臀一区二区三区|