C/C++ 递归算法,在二叉树中求位于先序序列中第k个位置的结点

基本的代码

前期准备(创建二叉树)

status creatTree(BiTree& T)
{
	TElemType m;
	scanf_s("%c", &m);
	if (m == ' ')//若输入的为空格则表示该结点为空
	{
		T = NULL;
		return ERROR;
	}
	else
	{
		T = (BiTree)malloc(sizeof(BiTNode));//开辟空间
		T->data = m;//赋值
		creatTree(T->lchild);//创建左节点
		creatTree(T->rchild);//创建右节点
		return OK;
	};
}

方法的实现(求位于先序序列中第k个位置的结点)

TElemType searchTree(BiTree T, int &n)//n要用引用
{
	if (T)//判断结点是否为空
	{
		if (n == 1) return T->data;//记录该结点是否是要找的结点
		n--;//不是n--
		char p = searchTree(T->lchild, n);//查找改结点的左孩子
		if(p!='0')
			return p;//如果找到了要找的值则返回
		char q = searchTree(T->rchild, n);//查找改结点的右孩子
		if (q != '0')
			return q;//如果找到了要找的值则返回
	}
	return 0;
}

全部代码

主函数

#include"标头.h"
using namespace std;
int main()
{
	int number;
	BiTree T;
	creatTree(T);
	cin >> number;
	cout<<searchTree(T, number)<<endl;
	return 0;
}

头文件

#pragma once
#include<iostream>
#define OK 1;
#define ERROR 0;
typedef  int  status;
typedef  char  TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;//左孩子与右孩子

}BiTNode,*BiTree;
int creatTree(BiTree& T);//创建二叉树
TElemType searchTree(BiTree T, int &n);//搜索先序排列的第n位置的结点

函数的定义

#include"标头.h"
using namespace std;
status creatTree(BiTree& T)
{
	TElemType m;
	scanf_s("%c", &m);
	if (m == ' ')//若输入的为空格则表示该结点为空
	{
		T = NULL;
		return ERROR;
	}
	else
	{
		T = (BiTree)malloc(sizeof(BiTNode));//开辟空间
		T->data = m;//赋值
		creatTree(T->lchild);//创建左节点
		creatTree(T->rchild);//创建右节点
		return OK;
	};
}
TElemType searchTree(BiTree T, int &n)//n要用引用
{
	if (T)//判断结点是否为空
	{
		if (n == 1) return T->data;//记录该结点是否是要找的结点
		n--;//不是n--
		char p = searchTree(T->lchild, n);//查找改结点的左孩子
		if(p!='0')
			return p;//如果找到了要找的值则返回
		char q = searchTree(T->rchild, n);//查找改结点的右孩子
		if (q != '0')
			return q;//如果找到了要找的值则返回
	}
	return '0';
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在C语言实现的递归算法,用于在二叉树找到先序遍历序列第k个节点: ```c #include<stdio.h> #include<stdlib.h> /*定义二叉树结构*/ typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; }TreeNode; /*二叉树先序遍历*/ void preorder(TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); preorder(root->left); preorder(root->right); } /*在二叉树查找第k个节点*/ void findKthNode(TreeNode* root, int k, int* count, int* result) { if (root == NULL) { return; } /*先遍历左子树*/ findKthNode(root->left, k, count, result); /*如果还没有找到第k个节点,则遍历当前节点*/ (*count)++; if (*count == k) { *result = root->val; return; } /*最后遍历右子树*/ findKthNode(root->right, k, count, result); } int main() { /*构造二叉树*/ TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 1; TreeNode* left1 = (TreeNode*)malloc(sizeof(TreeNode)); left1->val = 2; root->left = left1; TreeNode* right1 = (TreeNode*)malloc(sizeof(TreeNode)); right1->val = 3; root->right = right1; TreeNode* left2 = (TreeNode*)malloc(sizeof(TreeNode)); left2->val = 4; left1->left = left2; TreeNode* right2 = (TreeNode*)malloc(sizeof(TreeNode)); right2->val = 5; left1->right = right2; TreeNode* left3 = (TreeNode*)malloc(sizeof(TreeNode)); left3->val = 6; right1->left = left3; TreeNode* right3 = (TreeNode*)malloc(sizeof(TreeNode)); right3->val = 7; right1->right = right3; /*输出二叉树先序遍历*/ printf("Preorder traversal of the binary tree:\n"); preorder(root); printf("\n"); /*在二叉树查找第k个节点*/ int k = 4; int count = 0; int result = -1; findKthNode(root, k, &count, &result); if (result != -1) { printf("The value of the node at position %d in the preorder traversal is: %d\n", k, result); } else { printf("There is no node at position %d in the preorder traversal.\n", k); } return 0; } ``` 在上面的代码,我们定义了一个二叉树结构体`TreeNode`,包含`val`、`left`和`right`三个成员变量,分别表示当前节点、左子树和右子树。我们还定义了两个辅助函数:`preorder`函数用于输出二叉树先序遍历;`findKthNode`函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值