最详细的建立二叉树的代码【深搜和层次遍历实现】

注意选取何种建树方法取决输入形式

package com.example.javalearn;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * @Date 2024/7/16 16:20
 * @Version 1.0
 */
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
         this.left = left;
         this.right = right;
    }
 }

public class LK_124_tree {

    public static void printTreeDFS(TreeNode root){
        if(root == null){
            return;
        }
        System.out.print(root.val+" ");
        printTreeDFS(root.left);
        printTreeDFS(root.right);
    }

    public static TreeNode buildTreebyBFS(String[] parts) {
        if (parts.length == 0 || parts[0].equals("null")) {
            return null;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(parts[0]));
        queue.offer(root);

        int index = 1;
        while (!queue.isEmpty() && index < parts.length) {
            TreeNode node = queue.poll();

            if (!parts[index].equals("null")) {
                node.left = new TreeNode(Integer.parseInt(parts[index]));
                queue.offer(node.left);
            }else{
                node.left = null;
            }
            index++;

            if (index < parts.length && !parts[index].equals("null")) {
                node.right = new TreeNode(Integer.parseInt(parts[index]));
                queue.offer(node.right);
            }else {
                node.right = null;
            }
            index++;
        }
        return root;
    }
    public static TreeNode bulidTreeDFS(int i, String[] traversal){
        if(i >= traversal.length || traversal[i].equals("null")){
            return null;
        }

        TreeNode newNode = new TreeNode(Integer.parseInt(traversal[i]));

        newNode.left = bulidTreeDFS(2*i+1,traversal);
        newNode.right = bulidTreeDFS(2*i+2,traversal);
        return newNode;
    }

    public static TreeNode buildTreebyBFS1(String[] traversal) {
        if (traversal.length == 0) {
            return null;
        }
        TreeNode root = null;
        Queue<TreeNode> queue = new LinkedList<>();
        for(int i = 0; i < traversal.length; i++){
            if(i == 0){
                root = new TreeNode(Integer.parseInt(traversal[0]));
                queue.add(root);
                continue;
            }
            TreeNode current = queue.peek();
            if(traversal[i].equals("null")){
                if(i % 2 == 1)
                    current.left = null;
                else{
                    current.right = null;
                    queue.poll();
                }
            }
            else{
                TreeNode p = new TreeNode(Integer.parseInt(traversal[i]));
                if(i % 2 == 1){
                    current.left = p;
                }else{
                    current.right = p;
                    queue.poll();
                }
                queue.add(p);
            }
        }
        return root;
    }

    public static void main(String[] args) {
        //[5,4,8,11,null,13,4,7,2,null,null,5,1]
        String input = "[1,2,3,null,-1,4,null,null,null,null,null,1,5]";
        input = input.substring(1, input.length() - 1); // 去掉方括号
        String[] parts = input.split(",");
//        使用层次遍历,输入时null下面不需要null
//        TreeNode root = buildTreebyBFS(parts);
        //使用深度遍历由于要使用索引,所以输入时要注意!最后一个数前的null都要有占位符
        TreeNode root = bulidTreeDFS(0,parts);
        printTreeDFS(root);
    }

上述代码可以直接运行,举个例子说明输入
在这里插入图片描述
采用深搜时:上述输入[5,4,8,11,null,null,13,4,7,2,null,null,null,null,5,1]
采用层次时:上述输入[5,4,8,11,null,13,4,7,2,null,null,5,1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是C语言二叉树层次遍历和中序遍历的完整代码: 1. 二叉树层次遍历 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TreeNode { char data; struct TreeNode *left; struct TreeNode *right; } TreeNode, *BiTree; // 根据中序遍历和层次遍历构建二叉树 void BuildTree(char *level, char *inorder, BiTree *T) { int i; int len = strlen(level); // 取得层次遍历长度 int pos; if (len == 0) return; char *p = strchr(inorder, level[0]); if (p == NULL) // 如果为空则... return; pos = p - inorder; // 取得根节点在中序遍历中的位置 (*T) = (TreeNode *)malloc(sizeof(TreeNode)); (*T)->data = level[0]; (*T)->left = NULL; (*T)->right = NULL; BuildTree(level + 1, inorder, &((*T)->left)); // 递归构建左子树 BuildTree(level + pos + 1, p + 1, &((*T)->right)); // 递归构建右子树 } // 层次遍历 void LevelOrder(BiTree T) { BiTree queue[1000]; int front = 0, rear = 0; if (T == NULL) return; queue[rear++] = T; while (front != rear) { BiTree p = queue[front++]; printf("%c ", p->data); if (p->left != NULL) queue[rear++] = p->left; if (p->right != NULL) queue[rear++] = p->right; } } int main() { char level[] = "ABDECFG"; char inorder[] = "DBEAFCG"; BiTree T = NULL; BuildTree(level, inorder, &T); printf("层次遍历结果:"); LevelOrder(T); return 0; } ``` 2. 二叉树中序遍历 ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { char data; struct TreeNode *left; struct TreeNode *right; } TreeNode, *BiTree; // 根据中序遍历和层次遍历构建二叉树 void BuildTree(char *level, char *inorder, BiTree *T) { int i; int len = strlen(level); // 取得层次遍历长度 int pos; if (len == 0) return; char *p = strchr(inorder, level[0]); if (p == NULL) // 如果为空则... return; pos = p - inorder; // 取得根节点在中序遍历中的位置 (*T) = (TreeNode *)malloc(sizeof(TreeNode)); (*T)->data = level[0]; (*T)->left = NULL; (*T)->right = NULL; BuildTree(level + 1, inorder, &((*T)->left)); // 递归构建左子树 BuildTree(level + pos + 1, p + 1, &((*T)->right)); // 递归构建右子树 } // 中序遍历 void InOrder(BiTree T) { if (T == NULL) return; InOrder(T->left); printf("%c ", T->data); InOrder(T->right); } int main() { char level[] = "ABDECFG"; char inorder[] = "DBEAFCG"; BiTree T = NULL; BuildTree(level, inorder, &T); printf("中序遍历结果:"); InOrder(T); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

miss writer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值