程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 題目1009:二叉搜索樹

題目1009:二叉搜索樹

編輯:C++入門知識

題目描述:
判斷兩序列是否為同一二叉搜索樹序列
輸入:
開始一個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。
接下去一行是一個序列,序列長度小於10,包含(0~9)的數字,沒有重復數字,根據這個序列可以構造出一顆二叉搜索樹。
接下去的n行有n個序列,每個序列格式跟第一個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜索樹。
輸出:

如果序列相同則輸出YES,否則輸出NO

樣例輸入:
2
567432
543267
576342
0
樣例輸出:
YES
NO
來源:

2010年浙江大學計算機及軟件工程研究生機試真題

AC代碼:

//前序遍歷序列和中序遍歷序列能唯一確定一個二叉樹
//本題關鍵在於數的構建和遍歷

#include
#include
#define N 20

struct Node { //二叉樹節點結構體
	char id;
	Node *lchild;
	Node *rchild;
};

Node *nodes[N];
char bst[N], s[N]; //接受輸入的字符串
char in1[N], pre1[N], in2[N], pre2[N]; //存放構建好的二叉樹的中序和前序遍歷序列
int k; //遍歷增量

void build(Node *no, Node *root) { //二叉樹的構建
	if(no->id > root->id) {
		if(root->rchild==NULL)
			root->rchild = no;
		else
			build(no,root->rchild);
	}
	if(no->id < root->id) {
		if(root->lchild==NULL)
			root->lchild = no;
		else
			build(no,root->lchild);
	}
}

void inOrder(Node *root, char in[]) { //中序遍歷
	if(root->lchild != NULL)
		inOrder(root->lchild,in);
	in[k++] = root->id; //將遍歷結果存放到數組,方便後面的序列比較
	if(root->rchild != NULL)
		inOrder(root->rchild,in);
}

void preOrder(Node *root, char pre[]) { //前序遍歷
	pre[k++] = root->id;
	if(root->lchild != NULL)
		preOrder(root->lchild,pre);	
	if(root->rchild != NULL)
		preOrder(root->rchild,pre);
}

int main() {
	//freopen("in.txt","r",stdin);
	int n, i;
	while(scanf("%d",&n)!=EOF && n) {
		scanf("%s",bst);
		int len = strlen(bst);
		for(i=0; iid = bst[i];
			nodes[i]->lchild = NULL; //節點左右孩子初始化為空
			nodes[i]->rchild = NULL;
		}
		for(i=1; iid = s[i];
				nodes[i]->lchild = NULL;
				nodes[i]->rchild = NULL;
			}
			for(i=1; i

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved