二叉树模板

#ifndef BINARYTREE_H
#define BINARYTREE_H
#include<vector>
#include<iostream>
using namespace std;
template<class ElemType>
struct BinaryTreeNode
{
ElemType data;
BinaryTreeNode<ElemType>* LChild;
BinaryTreeNode<ElemType>* RChild;
BinaryTreeNode<ElemType>* parent;

BinaryTreeNode(ElemType item = ElemType(), BinaryTreeNode<ElemType>* L = nullptr, BinaryTreeNode<ElemType>* R = nullptr, BinaryTreeNode<ElemType>* P = nullptr)
    : data(item), LChild(L), RChild(R), parent(P) {}
};

template<class ElemType>
class BinaryTree
{
private:
BinaryTreeNode<ElemType>* root;

void destroy(BinaryTreeNode<ElemType>*& node)
{
    if (node != nullptr)
    {
        destroy(node->LChild);
        destroy(node->RChild);
        delete node;
        node = nullptr;
    }
}

void preorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result)
{
    if (node != nullptr)
    {
        result.push_back(node->data);
        preorder(node->LChild, result);
        preorder(node->RChild, result);
    }
}

void inorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result)
{
    if (node != nullptr)
    {
        inorder(node->LChild, result);
        result.push_back(node->data);
        inorder(node->RChild, result);
    }
}

void postorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result)
{
    if (node != nullptr)
    {
        postorder(node->LChild, result);
        postorder(node->RChild, result);
        result.push_back(node->data);
    }
}
public:
BinaryTree() : root(nullptr) {}
~BinaryTree()
{
destroy(root);
}

void createFromLevelOrder(vector<ElemType> elements, ElemType empty)
{
    if (elements.empty() || elements[0] == empty)
        return;

    queue<BinaryTreeNode<ElemType>**> q;
    root = new BinaryTreeNode<ElemType>(elements[0]);
    q.push(&root);

    size_t i = 1;
    while (i < elements.size()) {
        BinaryTreeNode<ElemType>** parent = q.front();
        q.pop();

        if (elements[i] != empty) {
            (*parent)->LChild = new BinaryTreeNode<ElemType>(elements[i]);
            (*parent)->LChild->parent = *parent;
            q.push(&((*parent)->LChild));
        }
        ++i;

        if (i < elements.size() && elements[i] != empty) {
            (*parent)->RChild = new BinaryTreeNode<ElemType>(elements[i]);
            (*parent)->RChild->parent = *parent;
            q.push(&((*parent)->RChild));
        }
        ++i;
    }
}

BinaryTreeNode<ElemType>* convertToLinkedList() {
    if (root == nullptr) {
        return nullptr;
    }

    // 找到链表头节点
    BinaryTreeNode<ElemType>* head = root;
    while (head->LChild != nullptr) {
        head = head->LChild;
    }

    // 中序遍历构建链表
    BinaryTreeNode<ElemType>* current = head;
    while (current != nullptr) {
        if (current->RChild != nullptr) {
            BinaryTreeNode<ElemType>* next = current->RChild;
            while (next->LChild != nullptr) {
                next = next->LChild;
            }
            next->LChild = current;
        }
        current = current->RChild;
    }

    return head;
}

void printPreorder()
{
    vector<ElemType> result;
    preorder(root, result);
    printResult(result);
}

void printInorder()
{
    vector<ElemType> result;
    inorder(root, result);
    printResult(result);
}

bool isBST() {
    if (root == nullptr) {
        return true;
    }
    vector<ElemType> result;
    inorder(root, result);
    for (size_t i = 1; i < result.size(); ++i) {
        if (result[i] <= result[i - 1]) {
            return false;
        }
    }
    return true;
}

void printPostorder()
{
    vector<ElemType> result;
    postorder(root, result);
    printResult(result);
}

void printResult(const vector<ElemType>& result)
{
    if (!result.empty())
    {
        cout << result[0];
        for (size_t i = 1; i < result.size(); ++i)
        {
            cout << ',' << result[i];
        }
    }
    cout << endl;
}
};

#endif

如果想进一步分解为头文件和源文件

头文件

#ifndef BINARYTREE_H
#define BINARYTREE_H

#include <vector>
#include <iostream>

using namespace std;

template<class ElemType>
struct BinaryTreeNode
{
    ElemType data;
    BinaryTreeNode<ElemType>* LChild;
    BinaryTreeNode<ElemType>* RChild;
    BinaryTreeNode<ElemType>* parent;

    BinaryTreeNode(ElemType item = ElemType(), BinaryTreeNode<ElemType>* L = nullptr, BinaryTreeNode<ElemType>* R = nullptr, BinaryTreeNode<ElemType>* P = nullptr)
        : data(item), LChild(L), RChild(R), parent(P) {}
};

template<class ElemType>
class BinaryTree
{
private:
    BinaryTreeNode<ElemType>* root;

    void destroy(BinaryTreeNode<ElemType>*& node);
    void preorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result);
    void inorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result);
    void postorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result);

public:
    BinaryTree();
    ~BinaryTree();
    void createFromLevelOrder(vector<ElemType> elements, ElemType empty);
    BinaryTreeNode<ElemType>* convertToLinkedList();
    void printPreorder();
    void printInorder();
    bool isBST();
    void printPostorder();
    void printResult(const vector<ElemType>& result);
};

#include "BinaryTree.cpp" // 包含实现文件

#endif

源文件

#include "BinaryTree.h"
#include <queue>

template<class ElemType>
BinaryTree<ElemType>::BinaryTree() : root(nullptr) {}

template<class ElemType>
BinaryTree<ElemType>::~BinaryTree()
{
    destroy(root);
}

template<class ElemType>
void BinaryTree<ElemType>::destroy(BinaryTreeNode<ElemType>*& node)
{
    if (node != nullptr)
    {
        destroy(node->LChild);
        destroy(node->RChild);
        delete node;
        node = nullptr;
    }
}

template<class ElemType>
void BinaryTree<ElemType>::preorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result)
{
    if (node != nullptr)
    {
        result.push_back(node->data);
        preorder(node->LChild, result);
        preorder(node->RChild, result);
    }
}

template<class ElemType>
void BinaryTree<ElemType>::inorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result)
{
    if (node != nullptr)
    {
        inorder(node->LChild, result);
        result.push_back(node->data);
        inorder(node->RChild, result);
    }
}

template<class ElemType>
void BinaryTree<ElemType>::postorder(BinaryTreeNode<ElemType>* node, vector<ElemType>& result)
{
    if (node != nullptr)
    {
        postorder(node->LChild, result);
        postorder(node->RChild, result);
        result.push_back(node->data);
    }
}

template<class ElemType>
void BinaryTree<ElemType>::createFromLevelOrder(vector<ElemType> elements, ElemType empty)
{
    if (elements.empty() || elements[0] == empty)
        return;

    queue<BinaryTreeNode<ElemType>**> q;
    root = new BinaryTreeNode<ElemType>(elements[0]);
    q.push(&root);

    size_t i = 1;
    while (i < elements.size()) {
        BinaryTreeNode<ElemType>** parent = q.front();
        q.pop();

        if (elements[i] != empty) {
            (*parent)->LChild = new BinaryTreeNode<ElemType>(elements[i]);
            (*parent)->LChild->parent = *parent;
            q.push(&((*parent)->LChild));
        }
        ++i;

        if (i < elements.size() && elements[i] != empty) {
            (*parent)->RChild = new BinaryTreeNode<ElemType>(elements[i]);
            (*parent)->RChild->parent = *parent;
            q.push(&((*parent)->RChild));
        }
        ++i;
    }
}

template<class ElemType>
BinaryTreeNode<ElemType>* BinaryTree<ElemType>::convertToLinkedList() {
    if (root == nullptr) {
        return nullptr;
    }

    BinaryTreeNode<ElemType>* head = root;
    while (head->LChild != nullptr) {
        head = head->LChild;
    }

    BinaryTreeNode<ElemType>* current = head;
    while (current != nullptr) {
        if (current->RChild != nullptr) {
            BinaryTreeNode<ElemType>* next = current->RChild;
            while (next->LChild != nullptr) {
                next = next->LChild;
            }
            next->LChild = current;
        }
        current = current->RChild;
    }

    return head;
}

template<class ElemType>
void BinaryTree<ElemType>::printPreorder()
{
    vector<ElemType> result;
    preorder(root, result);
    printResult(result);
}

template<class ElemType>
void BinaryTree<ElemType>::printInorder()
{
    vector<ElemType> result;
    inorder(root, result);
    printResult(result);
}

template<class ElemType>
bool BinaryTree<ElemType>::isBST() {
    if (root == nullptr) {
        return true;
    }
    vector<ElemType> result;
    inorder(root, result);
    for (size_t i = 1; i < result.size(); ++i) {
        if (result[i] <= result[i - 1]) {
            return false;
        }
    }
    return true;
}

template<class ElemType>
void BinaryTree<ElemType>::printPostorder()
{
    vector<ElemType> result;
    postorder(root, result);
    printResult(result);
}

template<class ElemType>
void BinaryTree<ElemType>::printResult(const vector<ElemType>& result)
{
    if (!result.empty())
    {
        cout << result[0];
        for (size_t i = 1; i < result.size(); ++i)
        {
            cout << ',' << result[i];
        }
    }
    cout << endl;
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以帮你写一个Python程序,实现二叉树模板。下面是一个简单的例子:class Node: def __init__(self, data): self.data = data self.left = None self.right = None # Tree class Tree: def __init__(self): self.root = None def getRoot(self): return self.root def add(self, data): if self.root is None: self.root = Node(data) else: self._add(data, self.root) def _add(self, data, node): if data < node.data: if node.left is None: node.left = Node(data) else: self._add(data, node.left) else: if node.right is None: node.right = Node(data) else: self._add(data, node.right) def find(self, data): if self.root: return self._find(data, self.root) else: return None def _find(self, data, node): if data == node.data: return node elif data < node.data and node.left is not None: self._find(data, node.left) elif data > node.data and node.right is not None: self._find(data, node.right) def deleteTree(self): # garbage collector will do this for us. self.root = None ### 回答2: 二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点,分别为左子节点和右子节点。我们可以使用Python语言编写一个简单的二叉树模板。 首先,我们定义一个节点类来表示二叉树的节点。每个节点有一个值和两个指针,指向左子节点和右子节点。节点类的代码如下: ```python class TreeNode: def __init__(self, value): self.val = value self.left = None self.right = None ``` 接下来,我们可以使用递归的方式创建二叉树。假设我们有一个列表 `values`,其中存储了二叉树的节点值。我们可以通过遍历列表,依次创建每个节点,并将节点按照特定的规则连接起来。创建二叉树的函数代码如下: ```python def createBinaryTree(values): if not values: return None root = TreeNode(values[0]) queue = [root] i = 1 while queue and i < len(values): node = queue.pop(0) if values[i] is not None: node.left = TreeNode(values[i]) queue.append(node.left) i += 1 if i < len(values) and values[i] is not None: node.right = TreeNode(values[i]) queue.append(node.right) i += 1 return root ``` 以上代码中,我们使用队列来辅助创建二叉树。我们首先创建根节点,并将它加入队列。然后,挨个遍历列表中的节点值。对于每个节点,我们弹出队列中的头节点,并根据列表的值创建左子节点和右子节点。接下来,将这些新创建的节点加入队列。最后,返回树的根节点即可。 可以使用以下代码测试二叉树模板的功能: ```python values = [1, 2, 3, None, 5, 6, 7] root = createBinaryTree(values) # 打印二叉树 def printBinaryTree(root): if not root: return print(root.val) printBinaryTree(root.left) printBinaryTree(root.right) printBinaryTree(root) ``` 以上代码中的 `values` 列表表示以下二叉树的结构: ``` 1 / \ 2 3 / \ 5 6 / 7 ``` 输出结果为: ``` 1 2 3 5 6 7 ``` 以上是一个基本的二叉树模板,可以根据需要进行扩展和修改,来满足更复杂的二叉树操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值