BTNode* BinaryTree::hy(char* pre, char* mid, int length) {//pre和mid分别是前序和中序的数组
//length是数组的长度,length的作用就是最后的时候叶节点的的孩子返回NULL结束递归
if (length == 0)
return NULL;
char temp = pre[0];//这个temp是根节点//temp存储每一次递归的根结点,也就是方法返回的节点
int index = 0;
while (mid[index] != temp) {
index++;//找到根节点在中序遍历中的下标
}
BTNode* node = new BTNode(temp);//此时的node为根节点
node->leftChild = hy(pre + 1, mid, index);
node->rightChild = hy(pre + index + 1, mid + index + 1, length - index - 1);
return node;
}
对于二叉树的层次遍历:
void BinaryTree::levelOrder(BTNode* node) {//以node为根结点进行遍历
BTNode* temp;
if (node == NULL)
{
return;
}
queue<BTNode*>q;//定义一个队列
q.push(node);
while (!q.empty())
{
//取出队列的头节点
temp = q.front();
q.pop();
str[tree++] = temp->data;
if (temp->leftChild !=NULL)q.push(temp->leftChild);
if (temp->rightChild!=NULL)q.push(temp->rightChild);
}
}
若给出一个数组,我们如何根据数组创建二叉树:
void BinaryTree::creatBinaryTree(BTNode* node, string s, int index) {//形参index是形参node的下标
//经过一次这个方法创造了node的左右子节点,输入s的作用就是判断长度是否够用
//注意第一个index从1开始
if (2 * index < s.length()) {//判断接下来还有没有左子节点
BTNode* node1 = new BTNode(s[2 * index]);
node->leftChild = node1;//注意不仅要创造节点,而且也要将父母节点与孩子节点产生连接
creatBinaryTree(node->leftChild, s, 2 * index);
}
if (2 * index + 1 < s.length()) {//判断接下来还有没有右子节点
BTNode* node2 = new BTNode(s[2 * index + 1]);
node->rightChild = node2;
creatBinaryTree(node->rightChild, s, 2 * index + 1);
}
}