6_41_递归求出二叉树先序遍历第k个节点的元素的值

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{
    int data;
    struct node*lchild,*rchild;
}tnode,*tree;
tree creat()
{
    int x;
    tree t;
    scanf("%d",&x);
    if(x==0)t=NULL;
    else
    {
        t=(tnode*)malloc(sizeof(tnode));
        t->data=x;
        t->lchild=creat();
        t->rchild=creat();
    }
    return t;
}
int TreeNum(tree t,int *k)
{
    if(t)
    {
        (*k)--;if(*k==0)return t->data;
        if(*k!=0)return TreeNum(t->lchild,k);
        if(*k!=0)return TreeNum(t->rchild,k);
    }
    return -1;
}
int main()
{
    int n;
    tree t=creat();
    printf("input a number:\t\n");
    scanf("%d",&n);
    printf("%d\n",TreeNum(t,&n));
}

在C语言中,实现输出二叉树先序遍历并找到第k个节点,通常需要递归的方法。先序遍历的顺序是根节点 -> 左子树 -> 右子树。以下是基本步骤: 1. 定义结构体表示二叉树节点,包含整数和左右子节点指针: ```c typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; ``` 2. 定义一个函数`findKthNodePreOrder`来寻找第k个节点。这里采用辅助栈来记录遍历过程,当节点数达到k时返回当前节点,否则继续递归遍历左子树: ```c int findKthNode(TreeNode* root, int k, int count) { if (root == NULL || count >= k) { return -1; // 如果到达空节点或计数超过k,则返回-1表示未找到 } // 先处理左子树 if (count < k) { int leftCount = findKthNode(root->left, k, count + 1); if (leftCount != -1) { return leftCount; } } // 将当前节点入栈,并更新计数 count++; stack[++top] = root; // 处理右子树 return findKthNode(root->right, k, count); } ``` 3. 最终,在主函数中调用上述函数,传入根节点、k以及初始计数0: ```c int main() { TreeNode* root = ...; // 初始化二叉树的根节点 int k; scanf("%d", &k); int result = findKthNode(root, k, 0); if (result != -1) printf("第 %d 个节点是:%d\n", k, result); else printf("找不到第 %d 个节点\n", k); return 0; } ``` 请注意,此代码假设输入合法,实际应用中你需要加上错误检查。另外,如果二叉树的大小未知且可能会很大,这种方法的时间复杂度较高,因为它需要遍历整个树。对于大规模数据,可以考虑优化算法,如使用队列等其他数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值