二叉樹求根節點到其他節點距離

題目要求

給定一棵二叉樹,假設其結點個數爲n,結點的編號爲1~n,且根節點的編號爲1,試編寫程序求從根節點
到其他每個結點的距離。要求:用左右鏈的方式存儲樹結構。
輸入格式:
第一行爲一個整數n,表示樹的結點的個數,n<1000下面n行中,每行都有兩個整數a和b,其中第i行表示編號爲i的結點的左孩子結點的編號爲a,右孩子結點的編號爲b。當a=0時,表示結點i沒有左孩子:當b=0時,表示結點i沒有右孩子。
輸出格式:
輸出n個整數,表示各個結點到根結點的距離。
輸入樣例:
4
23
04
00
00
輸出樣例:
0112

思路

涉及到二叉樹求路徑長度的問題,採用遞歸的方法,設置一個初始距離k爲0,遞歸函數中先傳入根節點,根節點到自身的距離爲0,所以直接將距離變量的值更新到dist數組中,然後檢測根節點是否有左孩子,如果有就遞歸調用自身,並把左孩子的位置和k+1作爲參數傳入。再同理檢測右孩子,執行完之後dist數組中對應位置的值就是根節點到每個節點的距離。

代碼實現

#define MAXNUM 1000
#include<stdio.h>
int dist[MAXNUM];			//存放二叉樹從根節點到各個節點的距離,初始爲0
typedef struct BTNode
{
	int data;				//結點的數據(程序中沒有用到,可忽略)
	int Lchild, Rchild;     //左孩子和右孩子的位置
}BTNode;
BTNode tree[MAXNUM];
void Btree_distance(int num, int k);
int main()
{
	int n,p,q;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)	//循環輸入n行數據,填充二叉樹節點數據
	{
		scanf("%d%d", &p, &q);
		tree[i].Lchild = p;
		tree[i].Rchild = q;
		dist[i] = 0;			//初始化dist數組
	}
	Btree_distance(0, 0);		//將根節點和初始距離0傳入
	for (int i = 0; i < n; i++)
		printf("%d", dist[i]);
	system("pause");
	return 0;
}
void Btree_distance(int num, int k)
{
	dist[num] = k;				//k的值代表當前節點到根節點的距離,直接存到dist數組的對應位置
	if (tree[num].Lchild != 0)
		Btree_distance(tree[num].Lchild -1, k + 1);		//遞歸調用自身求左子樹到根節點的距離
	if(tree[num].Rchild != 0)
		Btree_distance(tree[num].Rchild -1, k + 1);		//同上
}

注意

遞歸函數中傳入的第一個值是tree[num].Lchild -1,這裏減一是因爲題目要求二叉樹根節點序號爲1,而數組是從0開始存。

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