二叉线索树插入元素的四种方法
关于函数间接修改指针值
树的遍历不涉及子叶的修改 所以不用考虑返回值和指针的问题
链表的逆序一般用的是循环 所以也不用考虑
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);
}
本文深入探讨了二叉树插入元素的四种方法:通过函数间接修改指针值、递归返回节点、递归返回void及循环插入。详细解析了每种方法的工作原理及其在二叉树中的应用,对比了不同方法的优缺点。

被折叠的 条评论
为什么被折叠?



