作業五 二叉樹II

這一塊的題目難度普遍較大,題目也比較經典,做不來的時候可以百度搜索思路,然後自己代碼實現



2322 二叉樹的創建 III

這題可以用遞歸來做,代碼實現不復雜,重點在於對先序和遞歸的理解。


附上代碼:

BTree creat()
{//ABD...C..
	BTree p = (BTree)malloc(sizeof(BTNode));
	char tmp;
	cin >> tmp;
	if (isalpha(tmp))
	{
		p->data = tmp;
		p->lchild = creat();
		p->rchild = creat();
	}
	else p = NULL;
	return p;
}


2323 2324 葉節點和葉節點數遍歷一下就行了,不具體展開



2325 二叉樹的樹深

  舉例:上面ABCD那棵樹的樹深是3(空節點是不算的),樹深需要比較左子樹和右子樹,取兩邊更大的一個。

  這題可以用分治的思想,把問題一步步縮小,比如求二叉樹T的樹深h,就相當於max(T->lchild.h+1,T->rchild.h+1),而T的左子樹又可以繼續往下分成左子樹的左子樹和左子樹的右子樹 ,即T->lchild.h=max(T->lchild->lchild.h+1,T->lchild->rchild.h+1)。然後一步步往下走,直到葉子節點。到來葉子節點左右孩子都是空了怎麼辦?返回1咯,最後一步步反哺,T.h就出來了。

int GetDepth(BTree root)
{
	if (!root) return 0;
	int i = 0, j = 0;
	if (root->lchild)
		i = GetDepth(root->lchild);
	if (root->rchild)
		j = GetDepth(root->rchild);
	return i > j ? i + 1 : j + 1;
}



2328 二叉樹帶節點數輸出

水題,輸出的時候判斷一下是不是空就行了



插句題外話:先中後序遍歷剛開始會搞不清,實際上只要知道先中後都是相對於 根節點 就不會弄混了。 先序就是根節點第一個遍歷,中序就是根節點第二個遍歷,後序就是根節點第三個遍歷。確定了根節點,剩下倆個的順序都是先左後右。(特殊情況下會先右後左,比如下面這道)

2329 二叉樹的豎向輸出   


問題1.輸出要從最右邊開始,然後依次向左移動輸出

問題2.要記錄樹深

在之前做遍歷輸出的時候應該可以發現,中序和後序都會先輸出最左邊的節點。所以我們在這裏做一個變通,把遍歷的順序改爲右中左(逆中序),你會發現輸出順序完美符合需求(*^▽^*)

樹深可以用之前寫過的函數,在遍歷輸出之前先記錄樹深;也可以在遞歸的時候直接記錄並輸出

void PrintTree(BTree bt, int nLayer)
{
	if (!bt ) return;
	PrintTree(bt->rchild, nLayer + 1);

	for (int i = 0; i<nLayer; i++)
		printf("-");
	printf("%c\n", bt->data);

	PrintTree(bt->lchild, nLayer + 1);
}




2330  二叉樹的橫向輸出                           令人禿頭的時刻到了_(:з」∠)_

一行行輸出,用層序遍歷,這是首先想到的

因爲要打‘-’號,所以需要從左往右確認是第幾個,接着到了最後一個要換行

而且當一行有多個點時,個個點之間‘-’的數量爲相減

問題1.怎麼確認是從左往右數的第N個

問題2.怎麼分辨該節點在第幾行

問題3.當一行有多個輸出時,怎麼確認還要打幾個‘-’號

解決1:左中右 中序遍歷一次,給每個節點定位

解決2:可以遍歷一次確定各節點深度;也可以在隊裏直接數個數(例如當第N行遍歷之後,一共新加入了X個節點,下一行每pop()一個節點,X--,X==0時換行)

解決3:用tmp臨時節點記錄上一個節點,中間‘-’的個數爲 now.n-tmp.n


2331 二叉樹確定

  具體看鏈接  http://blog.csdn.net/qq_38449464/article/details/78674855

  簡單講,先序提供根節點的信息,中序提供所有節點的排序信息,結合兩者確定二叉樹。

  如果題目給的是後序和中序,那麼就從後序的最右邊開始遍歷(因爲後序的最後一個是根節點,和先序是反的)

  如果題目只給先序和後序,無法確定二叉樹。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章