23王道——二叉树的层次遍历

打s不用带头结点的链队列了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

首先是Linknode,队列结点那里,struct后面没加,就搞了十分钟
然后就是那个头结点,老是在出队有问题,我自己在主函数里面实验,入队出队都是正常的,到了函数调用就给我出错,我都服了,改成不带头结点的,一下子就对了,大业的,以后狗都不用带头结点的

言归正传,队列插入时,和删除时,需要考虑第一个结点和最后一个结点的特殊情况

#include<iostream>
using namespace std;

typedef struct Treenode {
	int data;
	struct Treenode* lchild, * rchild;
}Treenode,*Tree;

//啊啊啊啊啊啊啊,这个头一定要加,搞了我十分钟才解决问题
typedef struct Linknode{
	Treenode* data;//辅助队列保存指针
	struct Linknode* next;
}Linknode;

typedef struct {
	Linknode* front, * rear;
}Queue;

//初始化树
void InitTree(Tree &T) {
	T = NULL;
}

//建立有序二叉树
int bulid(Tree &T, int e) {
	if (T == NULL) {//当前结点为空
		T = new Treenode;
		T->data = e;
		T->lchild = NULL;
		T->rchild = NULL;
		return 0;
	}
	if (e < T->data) {//应插在左孩子
		bulid(T->lchild, e);
	}
	else {
		bulid(T->rchild, e);
	}
	return 0;
}

void visit(Tree T) {
	cout << T->data << " ";
}

void preorder(Tree T) {
	if (T != NULL) {
		visit(T);
		preorder(T->lchild);
		preorder(T->rchild);
	}
}

//初始化队列
void InitQueue(Queue& Q) {
	Q.front = Q.rear = NULL;
}

//入队
void enQueue(Queue& Q, Tree T) {
	Linknode* p = new Linknode;
	p->data = T;
	p->next = NULL;
	if (Q.front == NULL) {
		Q.front = p;
		Q.rear = p;
	}
	else {
		Q.rear->next = p;
		Q.rear = p;
	}
}

//出队
bool deQueue(Queue& Q,Tree &p) {
	if (Q.front == NULL) {
		cout << "空队列" << endl;
		return false;
	}
	else {
		p = Q.front->data;
		Q.front = Q.front->next;
		if (Q.front == NULL)//最后一个结点
			Q.rear = Q.front;
		return true;
	}
}

//判空队列
bool empty(Queue Q) {
	if (Q.front == NULL)
		return true;
	return false;
}

//层次遍历
void wide_order(Tree T) {
	Queue Q;
	InitQueue(Q);
	enQueue(Q, T);//根节点入队
	Tree p;
	while (!empty(Q)) {
		deQueue(Q, p);//这里有问题
		visit(p);
		if (p->lchild != NULL) {
			enQueue(Q, p->lchild);
		}
		if (p->rchild != NULL)
			enQueue(Q, p->rchild);
	}

}

int main() {
	Tree T;
	InitTree(T);
	bulid(T, 10);
	bulid(T, 20);
	bulid(T, 8);
	bulid(T, 22);
	bulid(T, 5);
	bulid(T, 9);
	bulid(T, 7);
	/*
					树结构:
							10
					       /  \		
						  8	  20	
						 / \    \
                        5   9    22
						 \
						  7
	*/
	preorder(T);
	cout << endl;
	
	//cout << Q.front->next->data->data;
	/*Queue Q;
	InitQueue(Q);
	Tree p;
	enQueue(Q, T);
	enQueue(Q, T->lchild);
	deQueue(Q, p);
	cout << p->data;
	deQueue(Q, p);
	cout << p->data;*/
	wide_order(T);
	
	return 0;
}

### 数据结构的相关知识概述 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等方面的学科。它主要涉及以下几个方面: #### 1. **逻辑结构** 逻辑结构是指数据元素之间的逻辑关系,而考虑其在计算机中的具体存储方式[^1]。常见的逻辑结构可以划分为以下几类: - **集合**:数据元素除了同属一个集合之外,没有任何其他关系。 - **线性结构**:数据元素之间具有一对一的关系,例如数组、链表等。 - **树型结构**:数据元素之间具有“一对多”的层次关系,典型的例子有二叉树、堆等。 - **图状结构(网状结构)**:数据元素之间呈现复杂的“多对多”关系,适用于表示网络拓扑等问题。 #### 2. **存储结构** 为了能够在计算机内存中实际存储这些逻辑结构的数据,需要定义具体的物理存储形式。常用的存储方法包括顺序存储和链接存储两种基本形式[^2]。 - **顺序存储**:通过连续分配地址空间来保存数据元素及其相互间的关系,适合于静态大小的线性结构。 - **链接存储**:利用指针字段显式地记录各节点间的联系,灵活性较高但可能增加额外的空间开销。 #### 3. **算法与运算** 当讨论某一特定类型的数据结构时,还需要明确该种结构支持哪些基础操作或查询功能,并基于此构建相应的高效解决方案。比如,在栈(Stack)这种特殊的线性表上实现了入栈(Push),出栈(Pop)等功能;而在哈希表(Hash Table)里则重点优化查找效率等等。 --- ### 推荐学习资料 对于希望深入掌握数据结构的学生或者从业者来说,《王道考研系列》是一个非常错的选择之一。这套书籍仅涵盖了理论知识点讲解还配有大量习题供读者练习巩固所学内容。以下是几个推荐方向及相关教程资源: - #### 图书教材 - *《数据结构(C语言版)》*——严蔚敏编著, 清华大学出版社出版。这本书被广泛认为是国内最权威的一本入门级教科书,覆盖全面且条理清晰。 - #### 在线课程平台 - MOOC网站如中国大学MOOC提供了许多由知名高校开设的数据结构公开课程; - LeetCode 和 Codeforces 平台上的刷题专区可以帮助初学者逐步积累实战经验并提高解题能力。 - #### 笔记分享社区 - GitHub 上有许多开源项目整理出了详尽的学习笔记文档,搜索关键词 “Data Structure Notes” 即可找到相关内容。 - 优快云博客论坛也有少博主定期更新关于各种复杂度分析的文章和技术贴士。 --- ### 实践案例展示 下面给出一段简单的 Python 程序演示如何创建单向链表这一经典数据结构实例: ```python class Node: def __init__(self, data=None): self.data = data # 存储当前结点值 self.next = None # 初始化下一个指向为空 def create_linked_list(values): head = tail = Node() # 创建头尾两个哑节点用于辅助连接过程 for value in values: node = Node(value) if not head.next: # 如果还没有设置过真正的头部,则现在完成初始化工作 head.next = node else: # 否则继续往后追加新成员直到遍历结束为止 tail.next = node tail = node # 更新尾巴位置以便下次循环使用 return head.next # 返回真实意义上的首项而非最初的占位符 # 测试函数调用效果如下所示 if __name__ == "__main__": sample_data = [10, 20, 30, 40] linked_list_head = create_linked_list(sample_data) current_node = linked_list_head while current_node is not None: print(current_node.data, end=" -> ") current_node = current_node.next print("None") # 表明最终到达终点处停止迭代流程 ``` 上述代码片段展示了如何手动建立一条包含若干整数单元组成的简单链条,并打印出来验证结果是否正确无误。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值