这个是我自己看书本,实现的二叉树,中间过程中发现了一些问题。下面会展示和解决。
首先在头文件中声明了一个二叉树的结点类和二叉树类
结点类里面声明了一个了一个data和一个指向左子树的指针和一个指向右结点的指针。
利用构造函数初始化。我在二叉树类里面声明了两个实现创建二叉树的方法
一个是结点里面存储数字 然后按左子树小于节点,节点小于右子树的方式存储;
这篇讲的是第二个,也就是存放的是字符。
#pragma once
#ifndef __BITREE_H__
#define __BITREE_H__
#include <string>
using 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<iostream>
#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<<" "<<level<<endl;
preOrder(p->lP,level+1);
preOrder(p->rP,level+1);
}
}
最后在main函数里面输出结果
#include<iostream>
#include "Bitree.h"
using namespace std;
int main() {
BiTree t;
//t.runInt();
t.runChar();
}
输入"a" ,"b" ," ", " ", " c"," "," "