【数据结构】树-三元组创建二叉树(动态图解、c++、java)

GitHub同步更新(已分类)Data_Structure_And_Algorithm-Review

公众号:URLeisure 的复习仓库
公众号二维码见文末

以下是本篇文章正文内容,下面案例可供参考。


一、概述

  • 假设以三元组(F,C,L / R)的形式输入一棵二叉树的诸边(其中 F 是双亲节点的标识,C 是孩子节点表示,L / R 表示 C 为 F 的左孩子 / 右孩子),且在输入的三元组序列中,C 是按层次顺序出现的。
  • 设节点的标识是字符类型:
  • F 为 NULL 时:
    • C 不为 NULL,C 为根节点标识;
    • C 为 NULL,表示输入结束。

二、算法步骤

  • 因为是按层次输入,所及可以借助队列实现。

算法步骤:

  1. 输入第一组数据,创建根节点入队;
  2. 输入下一组数据;
  3. 如果队列非空且输入数据前两项非空,则队头元素出队;
  4. 判断输入数据中的双亲是否和队头元素相等
    • 不相等,则转向第 3 步;
    • 相等,则创建一个新节点,判断该节点使其双亲的左孩子还是右孩子,并做相应的处理,然后新节点入队。
    • 输入下一组数据,转向第 4 步(因为一个对头元素可能有两个孩子,所以不能创建一个孩子就结束)。
  5. 直到队列为空或者输入数据前为两项为空,算法停止。

三、图解

输入如下:

NULL A L
A B L
A C R
B D R
C E L
C F R
D G L
F H L
NULL NULL L

在这里插入图片描述

四、代码

c++代码如下(示例):

void CreateTree(Btree &T) {
    string a, b, c;
    cin >> a >> b >> c;
    Btree p, node;
    queue<Btree> q;
    if (a == "NULL" && b != "NULL") {
        node = new BNode;
        node->data = b;
        node->lchild = node->rchild = nullptr;
        T = node;
        q.push(node);
    }
    cin >> a >> b >> c;
    while (!q.empty() && a != "NULL" && b != "NULL") {
        p = q.front();
        q.pop();
        while (p->data == a) {
            node = new BNode;
            node->data = b;
            node->rchild = node->lchild = nullptr;
            if (c == "L") {
                p->lchild = node;
            } else {
                p->rchild = node;
            }
            q.push(node);
            cin >> a >> b >> c;
        }
    }
}

java代码如下(示例):

private static BNode createTree(BNode t) {
    BNode p, node;
    String a = sc.next();
    String b = sc.next();
    String c = sc.next();
    LinkedList<BNode> q = new LinkedList<>();
  	if (a.equals("NULL") && !b.equals("NULL")) {
        node = new BNode();
        node.data = b;
        node.lchild = node.rchild = null;
        t = node;
        q.add(node);
    }
    a = sc.next();
    b = sc.next();
    c = sc.next();
  	while (!q.isEmpty() && !a.equals("NULL") && !b.equals("NULL")) {
      	p = q.pop();
        while (p.data.equals(a)) {
            node = new BNode();
            node.data = b;
            node.lchild = node.rchild = null;
            if (c.equals("L")) {
                p.lchild = node;
            } else {
                p.rchild = node;
            }
            q.add(node);
            a = sc.next();
            b = sc.next();
            c = sc.next();
        }
    }
    return t;
}

五、完整代码

c++代码如下(示例):

#include<iostream>
#include<queue>

using namespace std;

typedef struct BNode {
    string data;
    BNode *rchild, *lchild;
} *Btree;

void CreateTree(Btree &T) {
    string a, b, c;
    cin >> a >> b >> c;
    Btree p, node;
    queue<Btree> q;
    if (a == "NULL" && b != "NULL") {
        node = new BNode;
        node->data = b;
        node->lchild = node->rchild = nullptr;
        T = node;
        q.push(node);
    }
    cin >> a >> b >> c;
    while (!q.empty() && a != "NULL" && b != "NULL") {
        p = q.front();
        q.pop();
        while (p->data == a) {
            node = new BNode;
            node->data = b;
            node->rchild = node->lchild = nullptr;
            if (c == "L") {
                p->lchild = node;
            } else {
                p->rchild = node;
            }
            q.push(node);
            cin >> a >> b >> c;
        }
    }
}

void preOrder(Btree T) {
    if (T) {
        cout << T->data << " ";
        preOrder(T->lchild);
        preOrder(T->rchild);
    }
}

int main() {
    Btree t;
    CreateTree(t);
    preOrder(t);
    cout << endl;
}
/*
NULL A L
A B L
A C R
B D R
C E L
C F R
D G L
F H L
NULL NULL L
*/

java代码如下(示例):

import javax.security.auth.login.CredentialException;
import java.util.LinkedList;
import java.util.Scanner;

public class A {
    private static Scanner sc = new Scanner(System.in);

    private static class BNode {
        String data;
        BNode lchild, rchild;
    }

    private static BNode createTree(BNode t) {
        BNode p, node;
        String a = sc.next();
        String b = sc.next();
        String c = sc.next();
        LinkedList<BNode> q = new LinkedList<>();
        if (a.equals("NULL") && !b.equals("NULL")) {
            node = new BNode();
            node.data = b;
            node.lchild = node.rchild = null;
            t = node;
            q.add(node);
        }
        a = sc.next();
        b = sc.next();
        c = sc.next();
        while (!q.isEmpty() && !a.equals("NULL") && !b.equals("NULL")) {
            p = q.pop();
            while (p.data.equals(a)) {
                node = new BNode();
                node.data = b;
                node.lchild = node.rchild = null;
                if (c.equals("L")) {
                    p.lchild = node;
                } else {
                    p.rchild = node;
                }
                q.add(node);
                a = sc.next();
                b = sc.next();
                c = sc.next();
            }
        }
        return t;
    }

    private static void preOrder(BNode t) {
        if (t != null) {
            System.out.print(t.data + " ");
            preOrder(t.lchild);
            preOrder(t.rchild);
        }
    }

    public static void main(String[] args) {
        BNode t = new BNode();
        t = createTree(t);
        preOrder(t);
    }
}
/*
NULL A L
A B L
A C R
B D R
C E L
C F R
D G L
F H L
NULL NULL L
*/

关注公众号,感受不同的阅读体验

请添加图片描述

下期预告:二叉树、树和森林的还原

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

扑腾的江鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值