【数据结构】二叉线索树插入元素的三种方法

本文深入探讨了二叉树插入元素的四种方法:通过函数间接修改指针值、递归返回节点、递归返回void及循环插入。详细解析了每种方法的工作原理及其在二叉树中的应用,对比了不同方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于函数间接修改指针值

树的遍历不涉及子叶的修改 所以不用考虑返回值和指针的问题
链表的逆序一般用的是循环 所以也不用考虑

char p[15] = "abcdef";
char p2[15] = "1235abcdef";
void change(char** p3)
{
	char* p2 = p;
	*p3 = p2;
}
char* change2(char* p3)
{
	p3 = p2;
	return p3;
}
void change3(char* p3)
{
	p3 = p;
}
int main()
{

	char* p1 = p;
	//方法一 不用函数
	char** p3 = &p1;
	(*p3) = p2;
	//方法二 传地址
	change(&p1);
	//方法三 返回值
	p1 = change2(p1);
	//错误方法
	change3(p1);
	return 0;
}

递归返回节点

因为传入的参数是Node*,子叶的类型也是Node*,如果直接传入node->left,并在里边对其元素进行修改,如果没有返回值的话,修改过后的left并不影响原本node->left的值,就像想要修改int类型的变量,在一个函数里出入int ,修改int之后,不返回的话,int不会改变。所以需要返回节点,把返回值传出来。
如果不这样做的话 原始的数1-2-3 给3增加一个节点 3-4 3-4和3对于2来说 是不一样的节点 所以必须没给返回值都得是Node* 改一个每一层的子节点都发生了变化

	void insert(Key k,Value v)
	{
		root=insert(root, k, v);//这棵树的头结点是node
	}

	Node* insert(Node* node, Key k, Value v)//传过来节点的值
	{
		if (node == NULL)//结束条件
		{
			node = new Node(k, v);//增加新节点
			count++;//当前树的count增加
			return node;
		}
		if (node->key == k)
		{
			node->value = v;
		}
		else if (node->key < k)
		{
			node->right=insert(node->right, k, v);//传过来的是
		}
		else { node->left = insert(node->left, k, v); }
		return node;
	}

递归返回void

相当于传递的是左右子树的地址 并对左右子数的地址取*进行修改 这样可以保留

	void insert_3(Key k, Value v)
	{
		insert_3(root, k, v);//这棵树的头结点是node
	}
		void insert_3(Node* &node, Key k, Value v)
	{
		if (node == NULL)
		{
			node = new Node(k, v);//增加新节点
			count++;//当前树的count增加
		}
		if (node->key == k)
		{
			node->value = v;
		}
		else if (node->key < k)
		{
			insert(node->right, k, v);//传过来的是
		}
		else { insert(node->left, k, v); }
	}

循环插入 临时变量为二级指针

循环插入之所以要用二级指针,是因为如果判断的当前子节点是否为空的话,是空需要给它的父节点赋值,但是现在没有变量表示父节点的位置
tmp = &((*tmp)->right) 表示tmp为当前节点右孩子的地址,通过*tmp表示节点右孩子的值,如果这个值为空,那么就改变它的值

	Node* insert_2(Key k, Value v)
	{
		Node** tmp = &root;
		while ((*tmp) != NULL)
		{
			if ((*tmp)->key == k) { (*tmp)->value = v; return root; }
			else if ((*tmp)->key > k) { tmp = &((*tmp)->left); }
			else { tmp = &((*tmp)->right); }
		}
		(*tmp) = new Node(k, v);
		return root;
	}

循环插入 临时变量为一级指针

如果不使用取地址的话 当前tmp就应该为父亲节点(树中原本存在的节点),判断原本存在的节点的key值,

	void insert_4(Key k, Value v)
	{
		Node* tmp =root;
		while ((tmp) != NULL)
		{
			if ((tmp)->key == k) { (tmp)->value = v; return; }
			else if ((tmp)->key > k) {
				if (!tmp->left)
				{
					tmp->left = new Node(k, v);
					return;
				}
				else
				{
					tmp = tmp->left;
				}
			}
			else {
				if (!tmp->right)
				{
					tmp->right = new Node(k, v);
					return;
				}
				else
					tmp = ((tmp)->right);
			}
		}
		root = new Node(k, v);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值