树和二叉树 | 一些遇到的小问题

1.

TreeNode<T> &a

TreeNode<T> &a是一个引用,指向类型为T的TreeNode节点。这个引用可以用来修改或访问该节点的值或属性。

2.

*BiTree是什么意思: 

typedef struct BiTNode
 { char data;
 struct BiTNode* lchild, * rchild; 
}BiTNode, * BiTree; 

BiTree是一种二叉树的数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。在C语言中,可以使用结构体来定义二叉树节点,其中BiTNode表示节点类型,BiTree表示指向节点的指针类型 

3.

f53f911a66594a008cf731bf63691dfc.jpg

二叉树左孩子——右孩子指的是地址而不是字母数据!指针指地址啊!

4.

解释代码中的T():if(pos>=size||L[pos]==T())

在这段代码中,T()表示类型T的默认值。当L[pos]等于T()时,说明当前位置没有被占用,可以插入新的元素。

首先,代码中的`T()`表示`T`类型的默认构造函数,用来判断顺序存储中的元素是否为空。如果当前位置`pos`超出了数组`L`的大小或者数组`L`中的元素为空(即默认构造函数生成的元素),则返回`NULL`。

5.

queue<const TreeNode<T>*> Q:为什么要加const TreeNode<T>*,const TreeNode<T>*是什么,为什么不能直接写queue Q

在这个代码中,`queue<const TreeNode<T>*> Q` 中的 `const TreeNode<T>*` 表示存储在队列中的元素是一个指向 `TreeNode` 类型对象的常量指针。这里使用 `const` 关键字的目的是为了确保在队列中的指针指向的对象不会被修改

`const TreeNode<T>*` 是一个常量指针,它指向的对象在指针被声明后不可被修改。这是因为队列是一种数据结构,它的目的是按照先进先出的顺序存储和访问元素。如果队列中的元素可以被修改,可能会导致数据结构的不一致性

因此,为了确保队列中的元素不会被修改,我们使用了常量指针。这样一来,即使在使用队列时,我们无法直接修改指针指向的对象,而只能通过指针来访问对象的值。

如果直接写 `queue Q`,那么队列中的元素就不会是常量指针,可以修改指针指向的对象,这可能不是我们所期望的。所以在这种情况下,我们需要明确指定队列中元素的类型为 `const TreeNode<T>*`。

6.

请用例子说明这行代码的作用:TreeNode<char> *t=MakeLinked(L,L.size(),0);

这行代码的作用是将顺序存储的二叉树转化为链式存储,并将转化后的二叉树的根节点赋值给指针 t。

假设有一个顺序存储的二叉树,存储在名为 L 的向量中。L.size() 返回向量 L 的大小。0 表示从根节点开始转化。

通过调用 MakeLinked 函数,并传入向量 L、向量的大小以及根节点的位置,函数会递归地将顺序存储的二叉树转化为链式存储,并返回根节点的指针。

最后,将返回的根节点指针赋值给指针 t,这样 t 就指向转化后的链式存储的二叉树的根节点。

7.

将二叉树的顺序存储结构转换为链式存储结构非递归算法

这几行代码的作用:    i++;
        while(i<n&&L[i]==T())
        {
            i++;
        }

这几行代码的作用是在跳过顺序存储数组中的空元素,找到下一个非空元素的位置。

首先,代码中的变量 i 表示当前位置, i++ 将 i 增加 1,即将位置移动到下一个位置。

在循环中,首先检查 i 是否小于 n(数组 L 的大小),同时检查 L[i] 是否等于 T() 的返回值(即判断元素是否为空)。如果满足这两个条件,则表示当前位置 i 是一个空元素,需要继续向后查找。

循环内部的语句 i++ 将 i 增加 1,即将位置移动到下一个位置。然后继续进行下一次循环,直到找到下一个非空元素的位置或者超出数组范围

template<class T>
TreeNode<T> *MakeLinked(const vector<T>& L)
{
	if(L.size()==0)
	return;
	Queue<TreeNode<T>*> Q;
	TreeNode<T> *t=GetBTNode(L[0])
	TreeNode<T> *parent,*child;
	Q.push(t);
	int i=0;n=L.size();
	while(!Q.empty())
	{
		if(2*i+1<n&&L[2*i+1]!=T())
		{
			child=GetBTNode(L[2*i+1]);
			parent->left=child;
			Q.push(child);
		}
			if(2*i+2<n&&L[2*i+2]!=T())
		{
			child=GetBTNode(L[2*i+2]);
			parent->right=child;
			Q.push(child);
		}
		i++;
		while(i<n&&L[i]==T())
		{
			i++;
		}
	}
	return t;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值