二叉树的创建 (c++)

这个是我自己看书本,实现的二叉树,中间过程中发现了一些问题。下面会展示和解决。

首先在头文件中声明了一个二叉树的结点类和二叉树类

结点类里面声明了一个了一个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"," "," "

 

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值