gpt4 book ai didi

c++ - 将二叉树转换为双线程二叉树?

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:50 24 4
gpt4 key购买 nike

我在搜索中找不到任何内容来满足我的问题,如果存在,我很抱歉!

我正在做一个关于线程二叉树的大学作业。 IE。各种遍历 - 双 TBT 上的中序、后序和前序。

这是 TBTNode 结构:

struct TBTNode {
TBTNode *left, *right, *parent;
char data;
bool left_normal, right_normal;
TBTNode(char d) {
data = d;
left = NULL;
right = NULL;
parent = NULL;
left_normal = true;
right_normal = true;
}
};

如您所见,二叉树节点和 TBT 节点之间没有太大区别,除了节点的属性,即。 {left,right}_normal 在需要时设置为 true。

要创建树,我有这个:

class TBT {
TBTNode *root;
public:
TBT() {
root = new TBTNode(0);
root->right = root;
root->right_normal = true;
cout << "Root:" ;
root->left = create();
if(root->left)
root->left_normal = true;
}
TBTNode* create();
};

TBTNode* TBT::create() {
char data;
TBTNode *node = NULL;
cout << endl << "Enter data (0 to quit): ";
cin >> data;
if(data == '0')
return NULL;
node = new TBTNode(data);
cout << endl << "Enter left child of " << data;
node->left = create();
if(node->left)
node->left->parent = node;
else {
node->left = root;
node->right = node->parent;
node->left_normal = node->right_normal = false;
}
cout << endl << "Enter right child of " << data;
node->right = create();
if(node->right)
node->right->parent = node;
else {
node->left = node;
node->right = node->parent->parent;
node->left_normal = node->right_normal = false;
}
return node;
}

使用上述代码递归创建树后,我想将其转换为双线程二叉树。我知道左 child 与 child 的顺序前任相关联,而权利与顺序后继者相关联的概念,但我无法创建算法。有人可以帮助我吗?

最佳答案

我自己找到了解决方案。首先按顺序遍历树,然后将节点添加到数组中。然后处理数组以链接线程,因为对于数组中的给定元素x,x之前的元素将是中序前驱,x之后的元素将是中序后继。对于第一个和最后一个元素,进行特殊检查以将它们链接到头节点(不是根节点)。

不需要父链接,已将其删除。

代码如下:

class TBT {
TBTNode *root;
void createInorderArray(TBTNode *T);
TBTNode **array;
unsigned array_size;
public:
TBT();
TBTNode* create();
void inorder();
void preorder();
};

TBT::TBT() {
root = new TBTNode(0);
root->right = root;
root->right_normal = true;
cout << "Root:" ;
root->left = create();
if(!root->left) {
root->left_normal = false;
root->left = root;
}
array = NULL;
array_size = 0;
createInorderArray(root->left);
for(unsigned i = 0; i < array_size; i++) {
if(!array[i]->left) {
array[i]->left = i == 0 ? root : array[i-1];
array[i]->left_normal = false;
}
if(!array[i]->right) {
array[i]->right_normal = false;
array[i]->right = i == (array_size - 1) ? root : array[i+1];
}
}
free(array);
array_size = 0;
}

void TBT::createInorderArray(TBTNode *T) {
if(!T)
return;
createInorderArray(T->left);
array = (TBTNode**) realloc(array, sizeof(TBTNode**) * ++array_size);
array[array_size-1] = T;
createInorderArray(T->right);
}

关于c++ - 将二叉树转换为双线程二叉树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9164977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com