二叉树的三序遍历

书中2.3.4节中没有给出代码,前序,中序和后序的遍历如下。

#include <stdio.h>
#include <stdlib.h>

struct BinaryTreeNode
{
    int value;
    struct BinaryTreeNode  *left;
    struct BinaryTreeNode  *right;
};

typedef struct BinaryTreeNode Tree;

Tree* construct(int val){
    Tree* node = (Tree*) malloc(sizeof(Tree));
    node->value = val;
    node->left = NULL;
    node->right = NULL;
}

void preOrder(Tree *root){
    if (root == NULL){
        return;
    }
    printf("%d ", root->value);
    preOrder(root->left);
    preOrder(root->right);
}

void inOrder(Tree *root){
    if (root == NULL){
        return;
    }
    inOrder(root->left);
    printf("%d ", root->value);
    inOrder(root->right);
}

void postOrder(Tree *root){
    if (root == NULL){
        return;
    }
    postOrder(root->left);
    postOrder(root->right);
    printf("%d ", root->value);
}

int main(void){
    Tree* root = construct(10);
    root->left = construct(6);
    root->right = construct(14);
    root->left->left = construct(4);
    root->left->right = construct(8);
    root->right->left = construct(12);
    root->right->right = construct(16);

    printf("preOrder\n");
    preOrder(root);
    printf("\ninOrder\n");
    inOrder(root);
    printf("\npostOrder\n");
    postOrder(root);
}

三种的递归遍历如上代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从前序遍历序列中还原二叉树的过程可以通过递归来实现。具体的步骤如下: 1. 创建一个全局变量,用于记录当前遍历到的节点在前序遍历序列中的索引,初始值为0。 2. 创建一个递归函数,函数参数包括前序遍历序列和当前子树的边界索引(start和end)。 3. 在递归函数中,首先判断边界索引是否合法(start大于end),如果不合法,则返回null。 4. 创建一个新节点,将前序遍历序列中当前索引位置的值赋给新节点。 5. 将全局索引值加1。 6. 在递归函数中,将当前子树的边界索引分为左子树和右子树的边界,并分别递归调用递归函数,传入左子树和右子树的边界索引。 7. 将递归调用返回的左子树和右子树连接到新节点上。 8. 返回新节点作为当前子树的根节点。 以下是使用Python示例代码实现从前序遍历得到二叉树的过程: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder, start, end): # 边界索引不合法,返回null if start > end: return None # 创建当前子树的根节点 root = TreeNode(preorder[buildTree.index]) buildTree.index += 1 # 划分左子树和右子树的边界索引,并递归调用 root.left = buildTree(preorder, start, buildTree.index-1) root.right = buildTree(preorder, buildTree.index, end) return root def buildTreeFromPreorder(preorder): buildTree.index = 0 # 初始化全局索引为0 return buildTree(preorder, 0, len(preorder)-1) # 示例调用 preorder = [3, 9, 20, 15, 7] root = buildTreeFromPreorder(preorder) ``` 以上代码中,通过定义一个全局索引变量 `buildTree.index` 来记录当前遍历到的节点位置,初始值为0。然后通过递归调用 `buildTree()` 函数来构建二叉树。最后返回根节点即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值