1099 Build A Binary Search Tree ,1043 Is It a Binary Search Tree 练习二叉查找树

首先需要明确二叉查找树的定义:二叉查找树是一棵数据域有序的二叉树,左子树结点的数据域均小于等于根结点的数据域,右子树结点的数据域均大于根结点的数据域。

1099 Build A Binary Search Tree (30分)

这道题用到了二叉查找树的一个性质:
二叉查找树的中序遍历结果是有序的。

另外注意对于题目中用编号给出结点时要学会用树的静态写法。
1099 Build A Binary Search Tree ,1043 Is It a Binary Search Tree 练习二叉查找树_第1张图片

const int maxn = 110;
struct tNode
{
     
	int data;
	int left = -1;
	int right = -1;
}tnodes[maxn];

int nums[maxn],n, order=0;

//中序遍历,将排好序的数字填入二叉查找树
void inOrder(int root)
{
     
	if (tnodes[root].left != -1)
		inOrder(tnodes[root].left);
	tnodes[root].data = nums[order++];
	if (tnodes[root].right != -1)
		inOrder(tnodes[root].right);
	
}

//用来控制空格
int flag = 0;
void Level(int root)
{
     
	queue<int> q;
	q.push(root);
	while (!q.empty())
	{
     
		int now = q.front();
		q.pop();
		if (flag == 0) {
     
			printf("%d", tnodes[now].data);
			flag = 1;
		}
		else
			printf(" %d", tnodes[now].data);
		if (tnodes[now].left != -1)
			q.push(tnodes[now].left);
		if (tnodes[now].right != -1)
			q.push(tnodes[now].right);
	}
}
int main()
{
     
	cin >> n;
	for (int i = 0; i < n; i++)
		scanf("%d %d", &tnodes[i].left, &tnodes[i].right);
	for (int i = 0; i < n; i++)
		scanf("%d", &nums[i]);
	sort(nums, nums + n);
	inOrder(0);
	Level(0);
}

1043 Is It a Binary Search Tree (25分)

这是一道比较典型的二叉查找树插入练习。
(1)在二叉查找树中插入一定是生成叶子结点(有助于理解)
(2)由于二叉树的结构发生了变化,因此插入函数的参数应该是结点的引用
否则 函数中root=new node这个语句对root的修改无法作用到原变量(即上一层的root->lchild与root->rchild)上去。那么也就不能把新结点插入到树上。
(3)这道题中题目说明了二叉查找树左子树结点小于根结点,右子树结点大于等于根结点。这与常规定义稍有区别。
(4)另外两个vector之间可以直接比较是否相等。

1099 Build A Binary Search Tree ,1043 Is It a Binary Search Tree 练习二叉查找树_第2张图片

struct tNode
{
     
	int data;
	tNode* left;
	tNode* right;
};
vector<int> given;
vector<int> pre;
vector<int> preM;
int n;
void insert(tNode* &root,int data)
{
     
	if (root == NULL)
	{
     
		root = new tNode;
		root->data = data;
		root->left = NULL;
		root->right = NULL;
	}
	else if (data < root->data)
		insert(root->left, data);
	else if(data>=root->data)
		insert(root->right, data);
}
void preOrder(tNode *root)
{
     
	pre.push_back(root->data);
	if (root->left != NULL)
		preOrder(root->left);
	if (root->right != NULL)
		preOrder(root->right);
}
int num = 0;
void postOrder(tNode *root)
{
     
	if (root->left != NULL)
		postOrder(root->left);
	if (root->right != NULL)
		postOrder(root->right);
	num++;
	printf("%d", root->data);
	if (num != n)
		printf(" ");
}
void postMirrorOrder(tNode *root)
{
     
	if (root->right != NULL)
		postMirrorOrder(root->right);
	if (root->left != NULL)
		postMirrorOrder(root->left);
	num++;
	printf("%d", root->data);
	if (num != n)
		printf(" ");
}
void preMirrorOrder(tNode *root)
{
     
	preM.push_back(root->data);
	if (root->right!=NULL)
		preMirrorOrder(root->right);
	if (root->left != NULL)
		preMirrorOrder(root->left);
}
int main()
{
     
	
	cin >> n;
	tNode *root = NULL;
	for (int i = 0; i < n; i++)
	{
     
		int data;
		scanf("%d", &data);
		given.push_back(data);
		insert(root,data);
	}
	preOrder(root);
	if (pre == given) {
     
		printf("YES\n");
		postOrder(root);
	}
	else
	{
     
		preMirrorOrder(root);
		if (preM == given) {
     
			printf("YES\n");
			postMirrorOrder(root);
		}
		else
			printf("NO\n");
	}
}

你可能感兴趣的:(1099 Build A Binary Search Tree ,1043 Is It a Binary Search Tree 练习二叉查找树)