題目要求
給定一棵二叉樹,假設其結點個數爲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開始存。