二叉树的创建与遍历

如果createtree的参数不是指针的引用,main中 createtree(T)是把指针T指向的地址传进去了。注意,只是地址,然后在createtree函数内部申请内存时,把这个地址给改变了, 但是因为传的是一个地址,这个地址本身跟T无关,T仅仅是指向了这个地址而以, 所以Create(T)之后,T还是指向原来的地址,并未改变。如果main函数里是:BiTree *T;那么经过createtree(T);之后,T还是那个没有初始化的T,报错。如果main函数里是:BiTree *T=(BiTree*)malloc(sizeof(BiTree)); 那么经过createtree(T);之后,T还是原来那个T,报错。所以,要想指针T的值经过createtree()之后就能改变的话,那么一定要用createtree(*&T),或者createtree(**T)

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

typedef struct bitree
{
	char data;
	struct bitree* left;
	struct bitree* right;
}BiTree,*pBiTree;//这两个名字不要一样!否则会出错


//递归法创建二叉树
void createtree(BiTree *&T)//这里一定要用引用!!,把那个根节点直接传进来
{
	T = (BiTree*)malloc(sizeof(BiTree));
	char data;
	std::cin >> data;
	if ('#' == data)
		T=NULL;
	if(T)
	{
		T->data = data;
		std::cout << "输入" << data << "的左子节点\n";
		createtree(T->left);
		std::cout << "输入" << data << "的右子节点\n";
		createtree(T->right);
}

}

//递归前序遍历输出二叉树,即根->左->右,VLR
void preorder(BiTree *T)
{
	if (T!=0)
	{
		std::cout <<T->data;
		std::cout<<" ";
		preorder(T->left);
		preorder(T->right);
	}
}

//递归中序遍历输出二叉树
void inorder(BiTree *T)
{
	if (T)
	{
		preorder(T->left);
		std::cout << T->data;
		std::cout << " ";
		preorder(T->right);
	}
}

//递归后序遍历输出二叉树
void postorder(BiTree *T)
{
	if (T)
	{
		preorder(T->left);
		preorder(T->right);
		std::cout << T->data;
		std::cout << " ";
	}
}


int main()
{
	std::cout << "请输入树的节点,按#结束:\n";
	BiTree *T=(BiTree*)malloc(sizeof(BiTree));//这里不用再分配内存了,分配内存也没事,浪费一点而已,T可以不用初始化,形参用引用就行!
	createtree(T);
	std::cout << "前序遍历二叉树结果为:\n";
	preorder(T);
	
	std::cout << "\n";
	
	std::cout << "中序遍历二叉树结果为:\n";
	inorder(T);
	
	std::cout << "\n";
	
	std::cout << "后序遍历二叉树结果为:\n";
	postorder(T);
	
	std::cout << "\n";
	
	system("pause");
}

 

posted @ 2019-08-21 17:24  昨夜昙花  阅读(17)  评论(0)    收藏  举报