从零开始学数据结构系列之第三章《二叉树链式结构及实现3》


中根遍历

​ 中根遍历的原理就是,先遍历左子树,然后再遍历根,然后右子树

​ 一句话来讲,就是 左 -> 中 -> 右

所以我们按如上顺序来算的话

先找到最左子树 D 因为对于A来说,B是他的左子树,对比B来说,D是他的左子树,之后后面为空

于是到左子树 B 发现B子树是C和E的“根”节点,于是继续向下寻找

继续到子树 E 之后就没有其他子树了,开始回溯到B,发现B遍历下面的都遍历完了,又回溯到A

继续到根 A 遍历完根,开始再去寻找未遍历部分的最左子树

继续到子树 F 之后就没有其他子树了,开始回溯到C

继续到子树 C 发现B子树是C和E的“根”节点,于是继续向下寻找

继续到子树 G 之后就没有其他子树了,因为已经全部遍历完了,开始回溯到B,再回溯到A,结束遍历

所以根遍历的顺序就是

D->B->E->A->F->C->G
在这里插入图片描述
递归的方式:

/*LNR:中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。 */
void inOrder(TreeNode* T) 
{
   	if(T == NULL)
		return;
	else
	{
		inOrder(T->lchild);
		printf("%c->",T->data);
		inOrder(T->rchild);
	}
}

非递归的方式,思想类似与栈的方式,相比前序遍历,修改了出栈的时打印
在这里插入图片描述

展示代码

/*可以输入
ABD##E##CF##G##
来进行验证
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define size 20

typedef struct TreeNode 
{
	char data;
	struct TreeNode *lchild;
	struct TreeNode *rchild;
}TreeNode;

typedef struct Node 
{
	TreeNode *data;
	struct Node *next;
}Node;


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;
		createTree(&(*T)->lchild,temp,index);
		createTree(&(*T)->rchild,temp,index);		
	}
}

void preOrder(TreeNode* T) 
{
	if(T==NULL)
		return;
	else
	{
		printf("%c->",T->data);
		preOrder(T->lchild);
		preOrder(T->rchild);
	}
}

// 中根遍历
Node* initQueue() 
{
	Node* node = (Node*)malloc(sizeof(Node));
	node->data = NULL;
	node->next =NULL;
	return node;
}

void enQueue(TreeNode* data, Node* list) 
{
	Node* node = (Node*)malloc(sizeof(Node));
	node->data = data;
	
	while(list->next)list=list->next;
	node->next = list->next;
	list->next=node;
}


int isEmpty(Node* Q) 
{
	if(Q->next == NULL)
		return 1;
	else
		return 0;
}

Node* deQueue(Node* Q)
{
 if (isEmpty(Q)) 
     return NULL;
 else 
 {
	Node *node = Q->next;
	Q ->next = node->next;
    return node;
 }
}

void levelTraverse(Node* Q, TreeNode* T) 
{
    enQueue(T, Q);
    while (!isEmpty(Q)) 
	{
        Node* node = deQueue(Q);
        printf("%c->", node->data->data);
        if (node->data->lchild) 
		{
            enQueue(node->data->lchild, Q);
        }
        if (node->data->rchild) 
		{
            enQueue(node->data->rchild, Q);
        }
    }
}



int main(int argc, char* argv[]) 
{
	TreeNode *T;
	int i=0;
	char *temp=NULL;
	Node* Q = initQueue();

	temp=(char*)malloc(sizeof(char) * (size+1));
	gets(temp);
	createTree(&T,temp,&i);
	preOrder(T);       
    printf("\n");
    levelTraverse(Q, T);
    printf("\n");

    return 0;
}

往期回顾

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

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树链式存储结构是通过指针实现数据结构,每个节点包括一个数据域和两个指针域,分别指向左子树和右子树。下面是二叉树链式存储结构的创建及基本运算。 1. 创建二叉树 二叉树可以通过手动输入或者读入数据来创建。下面是手动输入创建二叉树的代码: ```c++ #include <iostream> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void createTree(TreeNode* &root) { int val; cin >> val; if (val == -1) { // 输入-1表示该节点为空 root = NULL; } else { root = new TreeNode(val); createTree(root->left); createTree(root->right); } } ``` 2. 遍历二叉树 二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。下面是三种遍历方式的代码实现: ```c++ // 前序遍历 void preOrder(TreeNode* root) { if (root == NULL) return; cout << root->val << " "; preOrder(root->left); preOrder(root->right); } // 中序遍历 void inOrder(TreeNode* root) { if (root == NULL) return; inOrder(root->left); cout << root->val << " "; inOrder(root->right); } // 后序遍历 void postOrder(TreeNode* root) { if (root == NULL) return; postOrder(root->left); postOrder(root->right); cout << root->val << " "; } ``` 3. 插入节点 二叉树的插入操作是向二叉树中插入一个新节点。下面是插入操作的代码实现: ```c++ void insertNode(TreeNode* &root, int val) { if (root == NULL) { root = new TreeNode(val); return; } if (val < root->val) { insertNode(root->left, val); } else { insertNode(root->right, val); } } ``` 4. 删除节点 二叉树的删除操作是将一个节点从二叉树中删除。删除操作需要考虑三种情况:删除的节点没有子节点、删除的节点有一个子节点、删除的节点有两个子节点。下面是删除操作的代码实现: ```c++ void deleteNode(TreeNode* &root, int val) { if (root == NULL) return; if (root->val == val) { if (root->left == NULL && root->right == NULL) { // 没有子节点 delete root; root = NULL; } else if (root->left == NULL || root->right == NULL) { // 有一个子节点 TreeNode* temp = root->left ? root->left : root->right; delete root; root = temp; } else { // 有两个子节点 TreeNode* temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->val = temp->val; deleteNode(root->right, temp->val); } } else if (val < root->val) { deleteNode(root->left, val); } else { deleteNode(root->right, val); } } ``` 以上是二叉树链式存储结构的创建及基本运算的代码实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值