输出二叉树前序序列中的第K个结点内容&测试

本文介绍如何在已知二叉树前序序列的情况下,找到并输出序列中的第K个节点。以三层满二叉树为例,通过前序遍历和递归实现,使用全局变量作为计数器,当计数器等于K时输出对应节点的值。文中还讨论了错误的实现方式及改进方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设已经建立好二叉树,知道二叉树的前序序列,要输出前序序列中第k(1<=k<=n)个结点中的数据应该怎么操作?

此次测试用的是三层满二叉树,层次遍历序列为ABCDEFG

总体思路就是递归的去前序遍历二叉树,设置一个全局变量i,每过一个结点就+1当作计数器,等i==k时返回那个结点的值,思路很简单但在递归这个问题上懵了。

建立二叉树沿用之前【已知前序中序创建二叉树】的代码简历,经过几次试错……终于写出了一个函数。

先贴上主函数:

void main(){
	BiTree T;
	char ch;
	char A[7]={'A','B','D','E','C','F','G'};
	char B[7]={'D','B','E','A','F','C','G'};
	T=PreInCreat(A,B,0,6,0,6);//到此处均为创建二叉树
	//ch=FINDK(T,4);
	//cout<<"第N个结点数据是:"<<ch<<endl;//以K为4
	FindK(T,4);
	system("pause");
}
(被//的两条语句是用来配合课本方法输出用的)

①课本上的FINDK():

解释在代码注释中

char FINDK(BiTree P,int k){
	char c
二叉树的前序遍历(根-左-右)中,对于任意给定的节点,它的后继节点是指在遍历过程中紧随其后的下一个节点。在前序遍历中,如果当前节点还有右子节点,那么后继就是右子节点;如果没有右子节点,就需要向上一寻找,即当前节点的父亲节点,然后看它是否有左子节点,如果有,左子节点就是后继。 以下是用C语言实现计算某个节点前序遍历后继的基本思路: ```c #include <stdio.h> // 假设二叉树结构为如下结构体 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 计算前序遍历后继 TreeNode* findSuccessor(TreeNode* root, TreeNode* node) { if (node->right != NULL) { // 如果有右子节点,直接返回右子树的最小节点 TreeNode *minNode = node->right; while (minNode->left != NULL) { minNode = minNode->left; } return minNode; } else { // 否则从父节点开始,递归查找左子树 if (root == NULL || node == root) return NULL; // 当到达根节点或者已经到最上 TreeNode* parent = node->parent; return parent->left == node ? parent : findSuccessor(parent, parent->left); } } int main() { // 假设你已经有了二叉树的定义和相关的节点指针 TreeNode* root = ...; TreeNode* targetNode = ...; TreeNode* successor = findSuccessor(root, targetNode); if (successor) printf("给定节点 %d 的后继是 %d\n", targetNode->val, successor->val); else printf("给定节点没有后继\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值