前序和中序遍历来构建二叉树

这里写图片描述

 import java.util.*;
 class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) { val = x; }
  }

public class Solution {
    HashMap<Integer,Integer>map=new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
         for(int i=0;i<preorder.length;i++)
              map.put(inorder[i],i);

        return BuildBinaryTree(0,0,inorder.length-1,preorder,inorder);
    }

     public TreeNode  BuildBinaryTree(int preStart,int inStart,int inEnd,int []preorder,int[]inorder){
         if(preStart>preorder.length-1||inStart>inEnd) 
             return null;
         TreeNode root=new TreeNode(preorder[preStart]);
         int index=map.get(root.val);
         root.left=BuildBinaryTree(preStart+1,inStart,index-1,preorder,inorder);
         root.right=BuildBinaryTree(preStart+index-inStart+1,index+1,inEnd,preorder,inorder);
         return root;
     }

    public static void main(String[]args){
       System.out.println("Hello World!");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,我们可以首先定义一个二叉树节点的抽象数据类型,然后使用二叉链表来实现这个二叉树。这里,我们假设每个节点包含一个字符和两个指向子节点的指针(左孩子和右孩子)。给定先序遍历为ABCDEFG,中序遍历为CBDAFEG,我们知道先序遍历的第一个元素是根节点,而中序遍历可以帮助我们重建树结构。 ```cpp #include <iostream> using namespace std; // 定义二叉树节点 class TreeNode { public: char data; TreeNode* left, *right; TreeNode(char ch) : data(ch), left(nullptr), right(nullptr) {} }; // 用于比较字符以找到中序序列中的正确位置 int findInOrderIndex(TreeNode* root, char target) { if (root == nullptr) return 0; if (root->data == target) return 1; int leftIndex = findInOrderIndex(root->left, target); if (leftIndex != 0) return leftIndex + 1; return findInOrderIndex(root->right, target); } // 用二叉链表实现二叉树的建立 TreeNode* buildTreeFromPreAndInOrder(string pre, string inOrder) { int n = pre.size(); TreeNode* root = new TreeNode(pre); int i = 1, j = findInOrderIndex(root, pre); while (i < n) { TreeNode* newNode = new TreeNode(pre[i]); if (pre[i] < pre[j - 1]) { // 根据中序遍历找到当前节点的位置 newNode->left = root->left; root->left = newNode; } else { // 向右寻找插入位置 while (j < n && pre[j] > pre[i]) { root = root->right; j++; } // 插入到右子树 root->right = newNode; } i++; } return root; } // 前序中序和后序遍历 void preorderTraversal(TreeNode* node) { if (node == nullptr) return; cout << node->data; // 前序 preorderTraversal(node->left); preorderTraversal(node->right); } void inorderTraversal(TreeNode* node) { if (node == nullptr) return; inorderTraversal(node->left); cout << node->data; // 中序 inorderTraversal(node->right); } void postorderTraversal(TreeNode* node) { if (node == nullptr) return; postorderTraversal(node->left); postorderTraversal(node->right); cout << node->data; // 后序 } int main() { string pre = "ABCDEFG"; string inOrder = "CBDAFEG"; // 建立二叉树 TreeNode* tree = buildTreeFromPreAndInOrder(pre, inOrder); // 遍历并打印结果 cout << "前序遍历: "; preorderTraversal(tree); cout << endl; cout << "中序遍历: "; inorderTraversal(tree); cout << endl; cout << "后序遍历: "; postorderTraversal(tree); cout << endl; return 0; } ``` 在这个程序中,`buildTreeFromPreAndInOrder` 函数用于根据先序和中序遍历构建二叉树,`preorderTraversal`, `inorderTraversal`, 和 `postorderTraversal` 分别实现了三种遍历方式。运行`main`函数后,会输出构建好的二叉树前序中序和后序遍历结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值