已知二叉树的两种遍历求另一种遍历(C++程序实现)

本文介绍如何通过已知的前序和中序遍历,或者已知的中序和后序遍历,来求解二叉树的另一种遍历。通过递归算法,利用已知的两种遍历顺序重建二叉树结构,并输出对应的前序、中序或后序遍历结果。
摘要由CSDN通过智能技术生成
//给定一棵二叉树的前序遍历和中序遍历,求其后序遍历

#include <iostream>
#include <string.h>
using namespace std;

typedef struct BinTree
{
    char data;
    BinTree* lchild;
    BinTree* rchild;
} BinTree;

void RebuildTree(BinTree* &Tree,char *pre,char *in,int len)
{
    Tree = new BinTree;
    if(Tree!=NULL)
    {
        if(len<=0)//递归截止条件
        {
            Tree = NULL;
            return ;
        }
        int index = 0;
        while(index<len&&*(pre)!=*(in+index))
        {
            //寻找当前的root结点(包含子树)
            index++;
        }
        Tree->data = *(pre);
        RebuildTree(Tree->lchild,pre+1,in,index);//去掉root结点
        RebuildTree(Tree->rchild,pre+1+index,in+1+index,len-(index+1));//去掉左边和根节点
    }
    return ;
}

void PostOrderTravese(BinTree* Tree)
{
    //后序遍历输出
    if(Tree==NULL)
        return;
    PostOrderT
思路: 1. 根据前遍历,找到根节点; 2. 根据中遍历,找到根节点在中遍历中的位置,从而确定左子树和右子树的中遍历; 3. 根据左子树和右子树的节点数,可以在前遍历中找到左子树和右子树的前遍历; 4. 递归地处理左子树和右子树。 代码实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 根据前遍历和中遍历构建二叉树 TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) { if (preorderSize == 0 || inorderSize == 0) { return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = preorder[0]; int i; for (i = 0; i < inorderSize; i++) { if (inorder[i] == preorder[0]) { break; } } int leftSize = i; int rightSize = inorderSize - i - 1; root->left = buildTree(preorder + 1, leftSize, inorder, leftSize); root->right = buildTree(preorder + 1 + leftSize, rightSize, inorder + i + 1, rightSize); return root; } // 后遍历二叉树 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->val); } int main() { int preorder[] = { 1, 2, 4, 5, 3, 6 }; int inorder[] = { 4, 2, 5, 1, 3, 6 }; int size = sizeof(preorder) / sizeof(int); TreeNode* root = buildTree(preorder, size, inorder, size); postorderTraversal(root); return 0; } ``` 运行结果: ``` 4 5 2 6 3 1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值