【数据结构】二叉树的创建和遍历

struct biTreeNode
{
	char data;
	biTreeNode *lchild;
	biTreeNode *rchild;
};

typedef biTreeNode* biNodePtr;

struct biTree
{
	biTreeNode *head;
};

结构定义,定义了树节点的结构体,以及树的结构体。

void init_biTree(biTree *mytree);//二叉树的初始化
void makeTree_preoder(biNodePtr *myNode);//前序生成树
void PreOrderTraverse(biNodePtr myNode);//前序遍历树
void init_biTree(biTree *mytree)
{
	mytree->head = NULL;
}
void makeTree_preoder(biNodePtr *myNode)
{
	char data;
	cin >> data;

	if (data == '#')
	{
		*myNode = NULL;
		return;
	}
	else
	{
		biTreeNode * s = (biTreeNode *)malloc(sizeof(biTreeNode));
		s->data = data;
		*myNode = s;
		makeTree_preoder(&(*myNode)->lchild);
		makeTree_preoder(&(*myNode)->rchild);
		return;
	}
}

前驱生成树,其实是个递归。每次生成,其实都在做同一件事情,即如果输入#号,就把指针赋值为空,否则就申请一个节点,存入数据后的地址赋值给当前的树节点指针,并且对该节点的左右孩子做以上的这些事情。

值得注意的是,形参应该是指针的指针。因为我们需要对指针赋值,如果形参只是传入指针的话,赋值的指针其实是函数创建的临时变量,会被系统回收。这点非常重要。


void PreOrderTraverse(biNodePtr myNode)
{
	if (myNode == NULL)
	{
		return;
	}
	else
	{
		cout << myNode->data << " ";
		PreOrderTraverse(myNode->lchild);
		PreOrderTraverse(myNode->rchild);
	}
}
树的前序遍历也是在对每个节点做同样的事情:如果节点为空,就返回,如果不为空,输出它的值,并且对左右孩子做相同的事情。


猜你喜欢

转载自blog.csdn.net/qq_35564841/article/details/80659555