二叉搜索树之蒜头君的新技能

蒜头君刚学会一项新技能——数据结构之二叉查找树。蒜头君想复习下刚学的知识,于是他找来一个序列,从序列第一个数开始,依次插入到二叉查找树里。蒜头君一边回忆刚学的知识,按照左孩子权值小,右孩子权值大的口诀,不一会儿就建立起了一棵二叉查找树。

现在蒜头君想来考考聪明的你:每个结点的左右孩子权值分别是什么?

输入格式

第一行输入一个正整数 N(1≤N≤1000)N (1 \leq N \leq 1000)N(1N1000),代表序列里元素个数。

第二行输入 NNN 个正整数,代表序列aNNN 个元素 (0≤ai≤10000)(0 \leq a_i \leq 10000)(0ai10000),保证序列里的元素值互不相同。

输出格式

请按格式a(b, c),输出引号之间的内容,a代表每个结点的权值,b代表其左孩子结点权值,c代表右孩子结点权值,如果孩子结点为空,则输出#代替。一个结点输出一行,按结点的权值从小到大输出。注意输出,后面的空格。

样例输入
5
2 5 3 1 4
样例输出
1(#, #)
2(1, 5)
3(#, 4)
4(#, #)
5(3, #)

 
#include<iostream>
using std::endl;
using std::cout;
using std::cin;
class Node
{
public:
	int data;
	Node* rchild,* lchild;
    Node(int _data)
    {
    	data = _data;
    	rchild = NULL;
    	lchild = NULL;
	}
    ~Node()
    {
    	if(rchild != NULL)
    	{
    		delete rchild;
		}
		if(lchild != NULL)
		{
			delete lchild;
		}
	}
	void insert(int value)
	{
		if(data == value)
		{
			return;
		}
		else if(value > data)
	    {
	    	if(rchild == NULL)
	    	{
	    		rchild = new Node(value);
			}
			else
			{
				rchild->insert(value);
			}
		}
		else
		{
			if(lchild == NULL)
			{
				lchild = new Node(value);
			}
			else
			{
				lchild->insert(value);
			}
		}
	}
	
	Node* search(int value)
	{
		if(data == value)
		{
			return this;
		}
		else if(value > data)
		{
			if(rchild == NULL)
			{
				return NULL;
			}
			else
			{
			    return rchild->search(value);
			}
		}
		else
		{
			if(lchild == NULL)
			{
				return NULL;
			}
			else
			{
				return lchild->search(value);
			}
		}
	}
};

class BinaryTree
{
private:
	Node* root;
public:
	BinaryTree()
	{
		root = NULL;
	}
	~BinaryTree()
	{
		if(root != NULL)
		{
			delete root;
		}
	}
	void insert(int value)
	{
		if(root == NULL)
		{
			root = new Node(value);
		}
		else
		{
		    root->insert(value);
        }
	}
	void output(int value)
	{
		Node* temp = root->search(value);
		if(temp->rchild == NULL)
		{
			if(temp->lchild == NULL)
			{
				cout << value << "(#, #)";
			}
			else
			{
				cout << value << "(" << temp->lchild->data << ", #)";
			}
		}
		else
		{
			if(temp->lchild == NULL)
			{
				cout << value << "(#, " << temp->rchild->data << ")"; 
			}
			else
			{
				cout << value << "(" << temp->lchild->data << ", " << temp->rchild->data << ")";
			}
		}
	}
};
int main()
{
	int num;
	cin >> num;
	int* list = new int[num];
	BinaryTree a;
	for(int i = 0; i < num; ++i)
	{
		cin >> list[i];
        a.insert(list[i]);	
	}
		for(int i = 0; i < num; ++i)
	{
	    for(int j = num - 1; j > i; --j)
		{
		    if(list[j] < list[j - 1])
			{
			    int temp = list[j];
				list[j] = list[j - 1];
				list[j - 1] = temp;	
			}	
		}	
	}
	for(int i = 0; i < num; ++i)
	{
		a.output(list[i]);
		cout << endl;
	}

	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搜索树和二排序树是树结构中的两种形式,它们在实现和使用上有一些区别。下面是它们的区别: 1. 定义: - 二搜索树:二搜索树是一种特殊的二树,其中每个节点的值大于其左子树中的所有节点的值,小于其右子树中的所有节点的值。 - 二排序树:二排序树也是一种特殊的二树,其中每个节点的值大于其左子树中的所有节点的值,小于其右子树中的所有节点的值,并且左子树和右子树也都是二排序树。 2. 插入操作: - 二搜索树:在二搜索树中插入一个节点时,需要按照节点值的大小关系找到合适的位置插入,保持二搜索树的性质。 - 二排序树:在二排序树中插入一个节点时,同样需要按照节点值的大小关系找到合适的位置插入,保持二排序树的性质。 3. 删除操作: - 二搜索树:在二搜索树中删除一个节点时,需要考虑节点的子节点情况,并进行相应的调整,以保持二搜索树的性质。 - 二排序树:在二排序树中删除一个节点时,同样需要考虑节点的子节点情况,并进行相应的调整,以保持二排序树的性质。 4. 平衡性: - 二搜索树:二搜索树的平衡性取决于节点的插入和删除操作,如果操作不当,可能导致二搜索树不平衡,进而影响搜索的效率。 - 二排序树:二排序树通常是平衡的,即左子树和右子树的高度差不超过1,这样可以保证搜索的效率。 综上所述,二搜索树和二排序树在定义、插入操作、删除操作和平衡性上存在一些区别。二搜索树是一种特殊的二树,而二排序树是一种特殊的二搜索树,它们都具有按照节点值的大小关系进行插入和删除操作的特点,但二排序树通常是平衡的,而二搜索树可能不平衡。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值