其他分享
首页 > 其他分享> > 数据结构代码题Day08---对应<Day48>

数据结构代码题Day08---对应<Day48>

作者:互联网

树结构代码题

假设二叉树采用二叉链表结构存储,设计一个算法,求二叉树中值为x的层号。

题目分析

下面给出题目所对应的二叉树的例子图:
在这里插入图片描述
同时根据上述的二叉树的例子图,这里采用二叉树的前序遍历操作进行设计。

前序遍历二叉树模板

	//结构体
	typedef struct BiTree{
		int data;
		struct BiTree *lchild,*rchild;
	}*BiTree;
	//二叉树遍历模板,前序
	void preTraverse(BiTree * root) {
		if(root == null) {
			return;
		}
		visit(root->data);
		preTraverse(root->lchild);
		preTraverse(root->rchild);
	}

改进模板–找到目标节点

	void preTraverse(BiTree * root,int x) {
		if(root == null) {
			return;
		}
		if(root->data == x){
			printf("%d",root->data);//找到了x的数据
		}
		//visit(root->data);
		preTraverse(root->lchild,x);//改进递归
		preTraverse(root->rchild,x);//改进递归
	}

重点!!!!(如何对层次进行增减)

对于该问题,我们现有的知识便是,在遍历过程中,向下走便是+1,向上走便是减一,因此对于上述的二叉树的模板,我们要对其执行步骤进行更深层次的模拟。看下图:

在这里插入图片描述
根据上述对题目的遍历对其进行操作设计分析,得到下图的代码执行过程图。
在这里插入图片描述

结合上述的操作,对上述的第二代模板进行改进如下:

模板再改进

	int level = 1;//初始化为1层次
	void preTraverse(BiTree * root,int x) {
		if(root == null) {//二叉树为null,返回0
			return 0;
		}
		if(root != null) {
			//找到目标节点
			if(root->data == x){
				printf("%d",level);//找到了x的数据
			}
			
			//@1,初次访问该节点,对应位置1,层次+1
			++level;
			preTraverse(root->lchild,x);//改进递归
			
			//@2 ,位置二、节点已经访问完
			
			preTraverse(root->rchild,x);//改进递归
			
			//@3, 位置三、 离开当前节点,层次-1
			--level;
		}
	}

上述便是题目的解答代码,关键在于明白二叉树的遍历的节点的访问的三次次序,并实现根据次序对其进行模板改进的算法实现!!

	printf("考研加油!!");

在这里插入图片描述

标签:Day08,模板,---,遍历,二叉树,Day48,root,节点,preTraverse
来源: https://blog.csdn.net/brotherand/article/details/121165474