之前看过的前序遍历的线索二叉树感觉写的有点问题 这里更新一下我的思路

前序线索化

#include<iostream>
using namespace std;

typedef int datatype;
typedef struct BitNode
{
	datatype Data;
	struct BitNode* leftchild;
	struct BitNode* rightchild;
	int lefttag;
	int righttag;
}Node;
#pragma region 前序线索化递归遍历
Node* previous = NULL;
void PreCuleOrder(Node* root)
{
	if (root == NULL)
	{
		return;
	}
	Node* tmpnode = NULL;
	tmpnode = root;
	if (tmpnode->leftchild == NULL )
	{
		tmpnode->leftchild = previous;
		tmpnode->lefttag = 1;
	}
	if (previous != NULL && previous->rightchild == NULL)
	{
		previous->rightchild = tmpnode;
		previous->righttag = 1;
	}
	previous = tmpnode;
	if (tmpnode->lefttag ==0)
	{
		PreCuleOrder(tmpnode->leftchild);
	}
	if (tmpnode->righttag == 0)
	{
		PreCuleOrder(tmpnode->rightchild);
	}
}
#pragma endregion

前序线索化遍历

#pragma region 前序遍历线索化二叉树
void PreIterativeTree(Node* root)
{
	if (root == NULL)
	{
		return;
	}
	Node* tmpnode = NULL;
	tmpnode = root;
	while (tmpnode!=NULL)
	{
		/*如果左子树一直非存在前继结点 那么一直遍历*/
		while (tmpnode->lefttag ==0)
		{	
			cout << tmpnode->Data << endl;
			tmpnode = tmpnode->leftchild;
		}
		/*出现连接上一层前继结点的叶子结点*/
		while (tmpnode->rightchild !=NULL)
		{
			if (tmpnode->lefttag ==0)
			{
				break;
			}
			else
			{
				cout << tmpnode->Data << endl;
				tmpnode = tmpnode->rightchild;
			}
		}
		if (tmpnode->rightchild == NULL)
		{
			cout << tmpnode->Data << endl;
			break;
		}
	}
}
#pragma endregion

主函数代码

int main(void)
{
	BitNode* n1 = new BitNode();
	BitNode* n2 =  new BitNode();
	BitNode* n3 =  new BitNode();
	BitNode* n4 =  new BitNode();
	BitNode* n5 =  new BitNode();
	BitNode* n6 =  new BitNode();
	BitNode* n7 =  new BitNode();
	BitNode* n8 =  new BitNode();
	BitNode* n9 =  new BitNode();
	n1->Data = 1, n2->Data = 2, n3->Data = 3, n4->Data = 4, n5->Data = 5, n6->Data = 6, n7->Data = 7, n8->Data = 8, n9->Data = 9;
	n1->leftchild = n2;
	n1->lefttag = 0;
	n2->leftchild = n4;
	n2->lefttag = 0;
	n4->leftchild = n5;
	n4->lefttag = 0;
	n1->rightchild = n3;
	n1->righttag = 0;
	n3->rightchild = n7;
	n3->righttag = 0;
	n3->leftchild = n6;
	n3->lefttag = 0;
	n7->leftchild = n9;
	n7->lefttag = 0;
	n7->rightchild = n8;
	n7->righttag = 0;
	PreCuleOrder(n1);
	PreIterativeTree(n1);
	return 0;
}

最终运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用构建二叉树的方法如下所示: 1. 首先定义一个结构体,结构体中包含一个字符类型的数据和两个指向左右子节点的指针。 2. 创建一个函数create_by_pre,该函数用于利用构建二叉树。函数中首先读取一个字符ch,如果ch为"#",则表示当节点为空,将其指针置为NULL;否则,创建一个新节点,并给节点的data赋值为ch。然后递归调用create_by_pre函数,将返回的指针赋值给新节点的左子节点指针,再次递归调用create_by_pre函数,将返回的指针赋值给新节点的右子节点指针。最后,返回构建的二叉树。 3. 创建函数preOrder,用于按照的顺输出二叉树的节点。如果当节点不为空,则先输出当节点的数据,然后递归调用preOrder函数输出左子节点和右子节点。 4. 创建中函数inOrder,用于按照中的顺输出二叉树的节点。如果当节点不为空,则先递归调用inOrder函数输出左子节点,然后输出当节点的数据,最后递归调用inOrder函数输出右子节点。 5. 创建后函数postOrder,用于按照后的顺输出二叉树的节点。如果当节点不为空,则先递归调用postOrder函数输出左子节点和右子节点,最后输出当节点的数据。 6. 在主函数main中,首先创建一个空指针T,并通过调用create_by_pre函数利用构建二叉树并将返回的指针赋值给T。然后分别调用preOrder、inOrder和postOrder函数输出、中和后的结果。 代码中的包含了创建二叉树、中和后的函数。您可以在输入过程中根据需要添加节点的数据,然后通过调用相应的遍函数输出二叉树的节点顺。<span class="em">1</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值