建立二叉树的二叉链表(严6.65)

本文介绍了一种根据给定的二叉树前序序列和中序序列来构造二叉链表的方法,并实现了后序遍历输出。通过递归算法创建二叉树节点,并按层次确定左右子树。

Description

已知一棵二叉树的前序序列和中序序列分别存于两个一维数组中,试编写算法建立该二叉树的二叉链表。

Input

分两行分别输入一棵二叉树的前序序列和中序序列。

Output

输出该二叉树的后序序列。

  • Sample Input 
    ABDFGCEH
    BFDGACEH
  • Sample Output
    FGDBHECA
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct BinTreeNode
{
    char data;
    struct BinTreeNode *lchild;
    struct BinTreeNode *rchild;
}BinTree, *PBinTree;

char pre[50],mid[50];
PBinTree CreateBinTree(int pre_start,int pre_end,int mid_start,int mid_end)
{
    PBinTree root = (PBinTree)malloc(sizeof(BinTree));
    root->data=pre[pre_start];
    root->lchild=NULL;
    root->rchild=NULL;
    int i;
    i=mid_start;
    while(mid[i]!=root->data)
        i++;

    int LTreeLen=i-mid_start;
    int RTreeLen=mid_end-i;
    if(LTreeLen)
    {
        root->lchild=CreateBinTree(pre_start+1,pre_start+LTreeLen,mid_start,i-1);
    }
    if(RTreeLen)
    {
        root->rchild=CreateBinTree(pre_start+LTreeLen+1,pre_end,i+1,mid_end);
    }
    return root;
}

void PrintBinTree (PBinTree p)
{
    if(p->lchild)
    {
        PrintBinTree(p->lchild);
    }
    if(p->rchild)
    {
        PrintBinTree(p->rchild);
    }
    printf("%c",p->data);
}

PBinTree Algo()
{
    int len_pre,len_mid;
    PBinTree T;
    len_pre=strlen(pre);
    len_mid=strlen(mid);
    T=CreateBinTree(0,len_pre-1,0,len_mid-1);
    return T;
}
int main()
{
    gets(pre);
    gets(mid);
    PBinTree T;
    T = Algo();
    PrintBinTree(T);
    return 0;
}

<think>好的,用户想了解如何用二叉链表存储二叉树,需要实现方法和代码示例。首先,我需要回忆二叉链表的基本结构。根据引用[3],二叉链表的每个节点包含数据域和左右孩子指针。所以,结构体应该包括data、lchild和rchild。 接下来要考虑创建二叉树的方法。用户提到先序递归遍历创建,如引用[1]中的任务。通常,先序遍历创建需要输入一个序列,比如用特殊符号表示空节点。比如,用户输入ABD##E##CF##G##,其中#代表空。 然后,需要实现前序、中序、后序遍历的函数。这部分应该递归实现,访问根节点的顺序不同。比如前序是先访问根,再左右;中序是左根右;后序是左右根。 代码示例方面,用户可能需要C或Python的实现。根据引用[2],Python中的节点可以用类来定义,包含val、left和right。而引用[3]中的C语言结构体定义也需要呈现。 需要注意的是,创建二叉树时,递归终止条件是什么。当遇到空节点(如输入#)时,返回None或NULL。在代码中,需要处理输入序列的索引,可能需要全局变量或者传递指针来跟踪当前处理的位置。 另外,用户可能对递归过程不太清楚,需要简单说明递归的步骤。比如,在创建函数中,先读取当前字符,如果是#则返回空,否则创建节点,并递归创建左右子树。 最后,确保代码符合语法,比如在Python中使用类定义,C中使用结构体和指针。同时,根据用户提供的引用,可能需要引用相关的资料,如引用[1]、[2]、[3]来支持说明。 总结步骤:1.定义节点结构;2.先序递归创建二叉树;3.实现三种遍历方式;4.提供代码示例;5.注意事项和扩展问题。</think>### 二叉链表存储二叉树实现方法 #### 一、二叉链表结构定义 二叉链表存储使用带左右孩子指针的节点结构,每个节点包含: - 数据域(存储节点值) - 左孩子指针(指向左子树) - 右孩子指针(指向右子树) C语言结构定义(引用自[^3]): ```c typedef struct BiTNode { TElemType data; // 节点数据 struct BiTNode *lchild; // 左孩子指针 struct BiTNode *rchild; // 右孩子指针 } BiTNode, *BiTree; ``` Python类定义(引用自[^2]): ```python class TreeNode: def __init__(self, val=0): self.val = val # 节点值 self.left = None # 左子树 self.right = None # 右子树 ``` #### 二、二叉树的创建(先序递归) 以先序遍历顺序(根-左-右)创建二叉树,输入序列用特殊符号(如`#`)标记空节点。 示例输入序列:`ABD##E##CF##G##` 对应二叉树结构: ``` A / \ B C / \ / \ D E F G ``` ##### C语言实现代码 ```c void CreateBiTree(BiTree *T) { char ch; scanf("%c", &ch); if (ch == '#') { *T = NULL; } else { *T = (BiTree)malloc(sizeof(BiTNode)); (*T)->data = ch; CreateBiTree(&(*T)->lchild); // 递归创建左子树 CreateBiTree(&(*T)->rchild); // 递归创建右子树 } } ``` ##### Python实现代码 ```python def create_tree(preorder: str, index: list) -> TreeNode: if index[0] >= len(preorder) or preorder[index[0]] == '#': index[0] += 1 return None node = TreeNode(preorder[index[0]]) index[0] += 1 node.left = create_tree(preorder, index) # 递归创建左子树 node.right = create_tree(preorder, index) # 递归创建右子树 return node # 调用示例 preorder_seq = "ABD##E##CF##G##" root = create_tree(preorder_seq, [0]) ``` #### 三、二叉树的遍历实现 1. **先序遍历**(根-左-右) C语言示例: ```c void PreOrderTraverse(BiTree T) { if (T) { printf("%c ", T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } ``` 2. **中序遍历**(左-根-右) Python示例: ```python def inorder_traversal(root): if root: inorder_traversal(root.left) print(root.val, end=' ') inorder_traversal(root.right) ``` 3. **后序遍历**(左-右-根) C语言示例: ```c void PostOrderTraverse(BiTree T) { if (T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c ", T->data); } } ``` #### 四、关键注意事项 1. **递归终止条件**:遇到`#`符号时返回空指针 2. **输入序列格式**:必须格遵循先序排列且包含空节点标记 3. **内存管理**(C语言):需手动释放二叉树内存防止泄漏
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值