非递归方式创建二叉树

简介:


好长时间没摸过二叉树了,纯属练手


我发现功能描述发布出来就乱了,还是贴图吧


#include <iostream>

using namespace std;
#define Type char
#define MAX_BUFF 30
#define INC_BUFF 20

typedef struct _TreeNode
{
	Type data;
	struct _TreeNode *lchild;
	struct _TreeNode *rchild;
}TreeNode;


TreeNode *createNode()
{
	TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
	memset(node, 0, sizeof(TreeNode));
	return node;
}
/***************************
function: createPreBinTree
description:根据先序历遍二叉树序列创建二叉树,历遍序列需要给出空树
如:
                                    A
				   /   \
		                 B     D
				/      /
			      C     E
                                \
				 G
先序了变序列是: ABC@G@@@DE@@@ (其中@代表空树)
原理:每当操作一个节点就将其push压栈,遇到空@就pop。
pop的目的就是为了创建右孩子。
****************************/
TreeNode *createPreBinTree()
{
	char buff[MAX_BUFF];
	cin >> buff;
	char *pBuffer = buff;

	TreeNode *stack[MAX_BUFF] = {0};//定义栈
	TreeNode **spHead = stack;
	TreeNode **spTail = stack;
	TreeNode *pTree = NULL;
	TreeNode *rootNode = NULL;
	bool isCreateR = false;

	if ( '@' == *pBuffer)
		return NULL;
	else
	{
		rootNode = createNode();
		pTree = rootNode;
		rootNode->data = *pBuffer;
		pBuffer++;
		*(++spHead) = rootNode;

		//if ('@' == *pBuffer)//判断root节点是否需要压栈
		//	isCreateR = true;
		//else
		//{
		//	
		//	isCreateR = false;
		//}
	}

	for (int i = 0;(*pBuffer); i++)
	{
		if ( '@' != *pBuffer)
		{
			if ( !isCreateR){//此时创建的是左孩子,需要压栈,压栈的目的是为了以后创建右孩子
				TreeNode *newNode = createNode();
				newNode->data = *pBuffer;
				pTree->lchild = newNode;
				pTree = newNode;
				*(++spHead) = newNode;
				/*spHead++;
				*spHead = newNode;*/
			}
			else
			{
				TreeNode *newNode = createNode();
				newNode->data = *pBuffer;
				pTree->rchild = newNode;
				pTree = newNode;
				*(++spHead) = newNode;
				isCreateR = false;
			}//if !isCreateR
		}
		else
		{
			if ( !isCreateR)
			{
				isCreateR = true;
				/*pTree = *spHead;
				*(spHead--) = NULL;*/
			}
			//else
			//{
			//	//isCreateR = true;//遇到右孩子是空,此时需要弹出栈顶
			//	if ( spHead == spTail)
			//		break;
			//}//if !isCreateR;

			if (spHead == spTail)
				break;
			else
			{
				pTree = *spHead;
				*(spHead--) = NULL;
			}
		}//if @
		pBuffer++;
	}
	return rootNode;
}

void visitNode(TreeNode *p)
{
	cout << p->data;
}

//先序历遍二叉树
void preTraverse(TreeNode *p)
{
	TreeNode *stack[MAX_BUFF] = {0};
	TreeNode **spTail = stack;
	TreeNode **spHead = spTail + 1;

	TreeNode *root = p;
	TreeNode *curr = root;

	//visitNode(root);
	//*(++spHead) = root;

	do
	{
		if (curr)
		{
			visitNode(curr);
			*(++spHead) = curr;
			curr = curr->lchild;
		}
		else 
		{
			if (spHead -1 != spTail)
			{
				curr = *spHead;
				*(spHead--) = NULL;
				curr = curr->rchild;
			}
			else
				--spHead;
		}
	}while (spHead  != spTail);
}

void main()
{
	TreeNode *node = createPreBinTree();
	preTraverse(node);
	cout << endl;

}

代码测试过了。谈不上什么效率和算法,纯属练手

目录
相关文章
|
存储 算法
二叉树的创建和遍历
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分
97 0
|
机器学习/深度学习 C++ 容器
二叉树创建和遍历(C++实现)
树(Tree)是n(n≥0)个节点的有限集。在任意一棵树中有且仅有一个特定的称为根(Root)的节点;当n>1时,其余节点可分m(m>0)为个互不相交的有限集T1,T2,...,Tm;其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 二叉树(Binary Tree)是一种特殊的有序树型结构,所有节点最多只有2棵子树。
720 0
二叉树的三种遍历方式
二叉树的三种遍历方式
253 0
二叉树的三种遍历方式
二叉树的创建,和三种递归遍历方式
二叉树的创建,和三种递归遍历方式
二叉树的三种非递归遍历方式
二叉树的三种非递归遍历方式
二叉树的创建,遍历完整代码
二叉树的创建,遍历完整代码
|
存储 算法
非递归法创建二叉树
非递归法创建二叉树
347 0
非递归法创建二叉树
二叉树的三种遍历方式,含demo(递归与非递归)
前置知识: 什么是二叉树:一个递归的树形数据结构,每个节点最多有两个子节点;二叉树一般都是二分查找树,每个节点的值大于它左子节点的值,小于它右子节点的值
14770 0
二叉树的三种遍历方式,含demo(递归与非递归)
|
机器学习/深度学习 编译器
606. 根据二叉树创建字符串 :「递归」&「非递归」&「通用非递归」
606. 根据二叉树创建字符串 :「递归」&「非递归」&「通用非递归」