这个是我自己看书本,实现的二叉树,中间过程中发现了一些问题。下面会展示和解决。
首先在头文件中声明了一个二叉树的结点类和二叉树类
结点类里面声明了一个了一个data和一个指向左子树的指针和一个指向右结点的指针。
利用构造函数初始化。我在二叉树类里面声明了两个实现创建二叉树的方法
一个是结点里面存储数字 然后按左子树小于节点,节点小于右子树的方式存储;
这篇讲的是第二个,也就是存放的是字符。
#pragma once #ifndef __BITREE_H__ #define __BITREE_H__ #includeusing namespace std; typedef char ElemType; //声明了一个二叉树的结点 class BitNode { public: ElemType data; class BitNode* lP; class BitNode* rP; BitNode():lP(nullptr), rP(nullptr){}; BitNode(ElemType data) :data(data),lP(nullptr),rP(nullptr) { } }; #endif class BiTree { public: BiTree() :rootNode(nullptr) {}; void runInt(); void runChar(); BitNode *rootNode; void createBiTreeInt(ElemType value); void creatBiTreeChar(BitNode **p); void preOrder(BitNode* p,int level); };
这里的形参是指向指针的指针,可以利用指向指针的指针对指向目前结点的指针进行操作;
为什么要用指向指针的指针呢?
我利用的是指针来创建一个二叉树。也就是
BitNode *head; creatBiTreeChar(&head);
因为在else里面需要在堆区创建一个新的结点,并且把这个新结点的地址传给指针,实现连接。
如果形参直接用指向结点的指针的话 则无法讲创建的结点的地址传给头结点。
如果是这样形参的传递是 BitNode *current = head
当执行current = new BitNode()的时候;
current重新指向了新的对象 也就是新的结点 但是head并没有指向新的结点 仍然还是空指针。
采用前序输入。如果输入空格就返回
迭代调用函数
#include#include"Bitree.h" void BiTree::creatBiTreeChar(BitNode** current) {//用指向指针的指针才能对指针操作。 //先输入一个字符,如果不是空格 就创建一个新的结点 然后把值赋给新的结点 然后给左子树赋值,再给右子树赋值 //如果输入的是空格 则将该结点的设为为空 char c; c = getchar(); if (c == ' ') { return;//如果是空格则就返回 即不对结点进行任何操作 } else { *current = new BitNode(c);//创建新的结点 给指针。 creatBiTreeChar(&(* current)->lP); creatBiTreeChar(&(*current)->rP); } } void BiTree::preOrder(BitNode* p,int level) { if (p != nullptr) { cout << p->data<<" "< lP,level+1); preOrder(p->rP,level+1); } }
最后在main函数里面输出结果
#include#include "Bitree.h" using namespace std; int main() { BiTree t; //t.runInt(); t.runChar(); }
输入"a" ,"b" ," ", " ", " c"," "," "



