1. 程式人生 > >順序儲存的二叉樹的最近的公共祖先問題 (25 分)

順序儲存的二叉樹的最近的公共祖先問題 (25 分)

順序儲存的二叉樹的最近的公共祖先問題 (25 分)

層次生成二叉樹

設順序儲存的二叉樹中有編號為i和j的兩個結點,請設計演算法求出它們最近的公共祖先結點的編號和值。

輸入格式:
輸入第1行給出正整數n(≤1000),即順序儲存的最大容量;第2行給出n個非負整數,其間以空格分隔。其中0代表二叉樹中的空結點(如果第1個結點為0,則代表一棵空樹);第3行給出一對結點編號i和j。

題目保證輸入正確對應一棵二叉樹,且1≤i,j≤n。

輸出格式:
如果i或j對應的是空結點,則輸出ERROR: T[x] is NULL,其中x是i或j中先發現錯誤的那個編號;否則在一行中輸出編號為i和j的兩個結點最近的公共祖先結點的編號和值,其間以1個空格分隔。

輸入樣例1:
15
4 3 5 1 10 0 7 0 2 0 9 0 0 6 8
11 4
輸出樣例1:
2 3
輸入樣例2:
15
4 3 5 1 0 0 7 0 2 0 9 0 0 6 8
12 8
輸出樣例2:
ERROR: T[12] is NULL

第一次寫層次生成二叉樹,程式碼有些凌亂,湊合著看吧,以後有空再改改
在這裡插入圖片描述

#include<cstdio>
#include<queue>
#include<cstdlib>
using namespace std;
struct BT{
	int data;
	BT* left;
	BT* right;
};
typedef
BT* bt; int n,cnt=0; int d[1005]; bt build(){ int data; bt p,t; queue<bt> q; data=d[++cnt]; if(data){ p=(bt)malloc(sizeof(BT)); p->data=data; p->left=NULL; p->right=NULL; q.push(p); } else return NULL; while(!q.empty()&&cnt<n){ t=q.front(); q.pop(); data=
d[++cnt]; if(!data) t->left=NULL; else{ t->left=(bt)malloc(sizeof(BT)); t->left->data=data; t->left->left=t->left->right=NULL; q.push(t->left); } data=d[++cnt]; if(!data) t->right=NULL; else{ t->right=(bt)malloc(sizeof(BT)); t->right->data=data; t->right->left=t->right->right=NULL; q.push(t->right); } } return p; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&d[i]); } int a,b,flag=1; scanf("%d %d",&a,&b); while(a!=b){ if(!d[a]){ printf("ERROR: T[%d] is NULL\n",a); flag=0; break; } if(!d[b]){ printf("ERROR: T[%d] is NULL\n",b); flag=0; break; } if(a>b) a>>=1; else b>>=1; } if(flag) printf("%d %d\n",a,d[a]); return 0; }