求先序,中序,后序等遍历中第k个结点的值

发布时间 2023-08-21 09:23:07作者: 正确选项

代码自己想的,23年8月21没有仔细看王道书上的代码和自己写的有什么区别,测试应该是对的。

但是如果k的值大于结点个数没有做判断

#include <stdio.h>
#include <stdlib.h>
 
typedef struct TNode{
    int data;
    struct TNode *lchild,*rchild;
}TreeNode,*Tree;

void CreateTree(Tree &T)
{
    int x;
    scanf("%d",&x);
    if(x==-1)
    {
        T=NULL;
        return;
    }
    else
    {
        T=(Tree)malloc(sizeof(TreeNode));
        T->data=x;
        printf("输入%d的左子节点:",x);
        CreateTree(T->lchild);
        printf("输入%d的右子节点:",x);
        CreateTree((T->rchild));
    }
}

//先序遍历二叉树(递归实现)
int PreOrderTree(Tree T,int k)
{
    static int count=0;
    if (T==NULL)
    {
        return -1;
    }
    else
    {
        if(++count==k)
        {
            printf("第3个元素的值为%d",T->data);
            return 0;
        }
        PreOrderTree(T->lchild,k);
        PreOrderTree(T->rchild,k);
    }
}

//中序遍历二叉树(递归实现)
int MidOrderTree(Tree T,int k)
{
    static int count=0;
    if(T==NULL)    
    {
        return -1;
    }
    else
    {
        MidOrderTree(T->lchild,k);
        if(++count==k)
        {
            printf("第3个结点值为%d",T->data);
            return 0;
        }
        MidOrderTree(T->rchild,k);
    }
} 

//后序遍历二叉树(递归实现)
int LatOrderTree(Tree T,int k)
{
    static int count=0;
    if(T==NULL)    
    {
        return -1;
    }
    else
    {
        LatOrderTree(T->lchild,k);
        LatOrderTree(T->rchild,k);
        if(++count==k)
        {
            printf("第6个结点值为%d",T->data);
            return 0;
        }
    }
}

int main()
{
    Tree T;
    CreateTree(T);
    PreOrderTree(T,3);
    MidOrderTree(T,5);
    LatOrderTree(T,6);
    return 0;
}