树的孩子表示法C++代码实现

这篇博客介绍了树的孩子表示法,通过一个数组存储节点数据,并使用链表表示节点间的父子关系。文中提供了一个C++代码示例,用于初始化和打印这种表示法的树结构。示例中创建了一个包含三个节点的树,节点分别为R、A和B,其中R有两个孩子A和B。
摘要由CSDN通过智能技术生成

树的孩子表示法

树的孩子表示法,概念很简单,是用一个数组保存每个节点的数据,每个节点再用1个链表保存树的关系

比如{<R,A>,<R, B>},这个数有3个节点,数组长度是3,然后有3个链表

R的链表有{头结点,A,B}
A的链表有{头结点}
B的链表有{头结点}

下面用代码实现


#include <stdio.h>

#include <iostream>


using namespace std;
#define MAX_TREE_SIZE 100

typedef struct RightNode{
    int data;//结点在数组的下标
    struct RightNode *next;//孩子链表
} RightNode;

typedef struct LeftNode{
    char data;//结点的值
    struct RightNode *child;//该结点的孩子
} LeftNode;

typedef struct{
    LeftNode left_node[MAX_TREE_SIZE];
    int n;//结点数
    int r;//根的位置
} ChileTree;


void init_data(ChileTree &tree){
    printf("输入节点数量:\n");
    scanf("%d", &(tree.n));
    for (int i = 0; i<tree.n; i++) {
        printf("输入第%d个节点内容:\n", i+1);
        getchar();
        scanf("%c", &tree.left_node[i].data);
        //链表使用头结点
        tree.left_node[i].child = (RightNode *)malloc(sizeof(RightNode));
        tree.left_node[i].child->next = NULL;
        
        //我有几个孩子,孩子在哪
        int child_num = 0;
        printf("输入%c有几个孩子:\n", tree.left_node[i].data);
        scanf("%d", &child_num);
        
        int k = 0;
        
        RightNode *p = tree.left_node[i].child;//链表的头结点
        while (child_num>0 && k<child_num) {//这里可以检查孩子个数和总结点的合法性
        
            printf("输入第 %d 个孩子节点在顺序表中的位置(0开始):\n", k+1);
            RightNode *right_node = (RightNode *)malloc(sizeof(RightNode));
            scanf("%d", &right_node->data);//这里可以检查数组下标的合法性
            
            right_node->next = NULL;
            
            p->next = right_node;
            p = right_node;//p指针要挪挪位置,不能挪头结点的指针内容
            k++;
        }
        printf("构造%c节点完成,他有%d个孩子节点\n", tree.left_node[i].data, child_num);
        
    }
    
}

void print_data(ChileTree tree){
    int i = 0;
    while (i<tree.n) {
        cout << "父亲节点 nodes[" << i << "]:" << tree.left_node[i].data << endl;
        RightNode *p = tree.left_node[i].child;//链表的头结点
        while (p->next!=NULL) {
            int j = p->next->data;//顺序表的位置
            cout << "它的孩子节点 nodes[" << j << "]:" << tree.left_node[j].data << endl;
            p = p->next;
        }
     
        i++;
    }
}
int main(){
    std::cout << "welcome, to my world!" << std::endl;
    ChileTree tree;
//    cout << "size of:" << sizeof(tree) <<endl;
    init_data(tree);
    print_data(tree);
    return 0;
}

输出

welcome, to my world!
输入节点数量:
3
输入第1个节点内容:
R
输入R有几个孩子:
2
输入第 1 个孩子节点在顺序表中的位置(0开始):
1
输入第 2 个孩子节点在顺序表中的位置(0开始):
2
构造R节点完成,他有2个孩子节点
输入第2个节点内容:
A
输入A有几个孩子:
0
构造A节点完成,他有0个孩子节点
输入第3个节点内容:
B
输入B有几个孩子:
0
构造B节点完成,他有0个孩子节点
父亲节点 nodes[0]:R
它的孩子节点 nodes[1]:A
它的孩子节点 nodes[2]:B
父亲节点 nodes[1]:A
父亲节点 nodes[2]:B
Program ended with exit code: 0

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
孩子表示法是一种的存储方式,它将每个节点的孩子节点保存在一个单链表中。以下是用 Python 实现孩子表示法代码: ```python class TreeNode: def __init__(self, data): self.data = data self.firstChild = None # 第一个孩子节点 self.nextSibling = None # 下一个兄弟节点 class ChildTree: def __init__(self, data=None, firstChild=None, nextSibling=None): self.root = TreeNode(data) self.root.firstChild = firstChild self.root.nextSibling = nextSibling def add_child(self, data): if self.root.firstChild is None: self.root.firstChild = TreeNode(data) else: p = self.root.firstChild while p.nextSibling is not None: p = p.nextSibling p.nextSibling = TreeNode(data) def print_tree(self): def dfs(node): if node is None: return print(node.data, end=' ') dfs(node.firstChild) dfs(node.nextSibling) dfs(self.root) ``` 以上代码中,`TreeNode` 类表示的节点,其中 `firstChild` 属性表示当前节点的第一个孩子节点,`nextSibling` 属性表示当前节点的下一个兄弟节点。`ChildTree` 类表示孩子表示法,其中 `root` 属性表示根节点,`add_child` 方法用于添加孩子节点,`print_tree` 方法用于打印的结构。 以下是一个使用示例: ```python t = ChildTree(1) t.add_child(2) t.add_child(3) t.root.firstChild.nextSibling = ChildTree(4) t.root.firstChild.nextSibling.add_child(5) t.print_tree() # 输出:1 2 3 4 5 ``` 以上代码中,我们创建了一个根节点为 1 的孩子表示法,然后添加了两个孩子节点 2 和 3,又添加了一个孩子节点 4,这个孩子节点 4 又有一个孩子节点 5。最后我们打印了整个的结构,输出为 `1 2 3 4 5`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值