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.
二叉树左孩子——右孩子指的是地址而不是字母数据!指针指地址啊!
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;
}