从零开始学数据结构系列之第三章《中序线索二叉树代码初始化及创树》


结构初始化

typedef struct TreeNode 
{
	char data;
	struct TreeNode *lchild;
	struct TreeNode *rchild;
	int ltag;
	int rtag;

}TreeNode;

这边对比之前中序二叉树就多出这两个东西

ltag==0,指向左孩子;ltag==1,指向前驱结点
rtag==0,指向右孩子;rtag==1,指向后继结点

创树

void createTree(TreeNode** T,char* temp,int* index)
{
	char ch;
	
	ch = temp[*index];
	(*index)++;

	if( ch == '#') *T = NULL;
	else
	{
		 *T =(TreeNode*)malloc(sizeof(TreeNode));
		 (*T)->data = ch;
		 (*T)->ltag = 0;
		 (*T)->rtag = 0;
		createTree(&(*T)->lchild,temp,index);
		createTree(&(*T)->rchild,temp,index);		
	}
}

只多了节点指示而已:

(*T)->ltag = 0;
(*T)->rtag = 0;

往期回顾

1.【第一章】《线性表与顺序表》
2.【第一章】《单链表》
3.【第一章】《单链表的介绍》
4.【第一章】《单链表的基本操作》
5.【第一章】《单链表循环》
6.【第一章】《双链表》
7.【第一章】《双链表循环》
8.【第二章】《栈》
9.【第二章】《队》
10.【第二章】《字符串暴力匹配》
11.【第二章】《字符串kmp匹配》
12.【第三章】《树的基础概念》
13.【第三章】《二叉树的存储结构》
14.【第三章】《二叉树链式结构及实现1》
15.【第三章】《二叉树链式结构及实现2》
16.【第三章】《二叉树链式结构及实现3》
17.【第三章】《二叉树链式结构及实现4》
18.【第三章】《二叉树链式结构及实现5》
19.【第三章】《中序线索二叉树理论部分》

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用C++语言实现的代码: ```c++ #include<iostream> #include<stack> using namespace std; // 定义二叉树节点的结构体 struct TreeNode { char data; // 数据域 TreeNode* leftChild; // 左孩子指针 TreeNode* rightChild; // 右孩子指针 bool leftTag; // 左线索标志 bool rightTag; // 右线索标志 TreeNode(char c) : data(c), leftChild(NULL), rightChild(NULL), leftTag(false), rightTag(false) {} }; // 先序遍历创建二叉树 TreeNode* createBinaryTree() { char c; cin >> c; if (c == '#') { // 如果输入#,表示该节点为空指针 return NULL; } TreeNode* root = new TreeNode(c); // 创建根节点 root->leftChild = createBinaryTree(); // 递归创建左子树 root->rightChild = createBinaryTree(); // 递归创建右子树 return root; } // 中序线索化二叉树 void inOrderThreading(TreeNode* root, TreeNode*& pre) { if (root == NULL) { // 如果是空树,直接返回 return; } inOrderThreading(root->leftChild, pre); // 递归线索化左子树 if (root->leftChild == NULL) { // 如果左孩子为空,将左孩子指针指向前驱节点 root->leftChild = pre; root->leftTag = true; } if (pre != NULL && pre->rightChild == NULL) { // 如果前驱节点的右孩子为空,将前驱节点的右孩子指针指向当前节点 pre->rightChild = root; pre->rightTag = true; } pre = root; // 更新前驱节点 inOrderThreading(root->rightChild, pre); // 递归线索化右子树 } // 获取中序线索二叉树的第一个节点 TreeNode* firstNode(TreeNode* root) { while (root->leftTag == false) { root = root->leftChild; } return root; } // 获取中序线索二叉树中节点的后继节点 TreeNode* nextNode(TreeNode* root) { if (root->rightTag == false) { // 如果右线索标志为false,表示有右孩子 return firstNode(root->rightChild); } else { // 如果右线索标志为true,表示没有右孩子,返回右线索指向的后继节点 return root->rightChild; } } // 通过找前驱的方式遍历中序线索二叉树 void inOrderTraverseByPredecessor(TreeNode* root) { while (root != NULL) { while (root->leftTag == false) { // 如果左线索标志为false,说明有左孩子,继续向左走 root = root->leftChild; } cout << root->data << " "; // 输出当前节点 root = root->leftChild; // 向左孩子继续遍历 } } // 通过找后继的方式遍历中序线索二叉树 void inOrderTraverseBySuccessor(TreeNode* root) { TreeNode* p = firstNode(root); // 获取第一个节点 while (p != NULL) { cout << p->data << " "; // 输出当前节点 p = nextNode(p); // 获取当前节点的后继节点 } } int main() { TreeNode* root = createBinaryTree(); // 创建二叉树 TreeNode* pre = NULL; inOrderThreading(root, pre); // 中序线索化二叉树 cout << "通过找前驱的方式遍历中序线索二叉树:"; inOrderTraverseByPredecessor(root); // 通过找前驱的方式遍历中序线索二叉树 cout << endl; cout << "通过找后继的方式遍历中序线索二叉树:"; inOrderTraverseBySuccessor(root); // 通过找后继的方式遍历中序线索二叉树 cout << endl; return 0; } ``` 以上代码中,`createBinaryTree`函数用于创建二叉树,`inOrderThreading`函数用于中序线索化二叉树,`firstNode`函数用于获取中序线索二叉树的第一个节点,`nextNode`函数用于获取中序线索二叉树中节点的后继节点,`inOrderTraverseByPredecessor`函数用于通过找前驱的方式遍历中序线索二叉树,`inOrderTraverseBySuccessor`函数用于通过找后继的方式遍历中序线索二叉树

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值