递归与非递归建立二叉树

二叉树中又有二叉树,也就是递归。所以使用递归建立二叉树是最简单的。思路很简单:咱们申明一个结构体TREENODE,该结构体有三个成员,分别是Value,LeftChild和RightChild。node

代码以下:函数

typedef struct _struct_tree_node
{
    char m_cData;
    _struct_tree_node* m_pLeftChild;
    _struct_tree_node* m_pRightChild;
}TREENODE, *LPTREENODE;

首先咱们new一个TREENODE,将输入一个值赋给Value,LeftChild=调用自身,RightChild=调用自身。完事之后返回。blog

代码以下:递归

LPTREENODE RecursionCreateTree(char* pValue)
{
  if(!pValue || !(*pValue) || *pValue == '#')return NULL;
  static int nIndex = 0;
  
  LPTREENODE pTemp = new TREENODE;
  memset(pTemp, 0, sizeof(TREENODE));
  pTemp->m_cData = *(pValue + nIndex++);
  pTemp->m_pLeftChild = RecursionCreateTree(pValue);
  pTemp->m_pRightChild = RecursionCreateTree(pValue); 
  return pTemp;
}

递归建立是否是很简单?哈哈。。。别高兴得太早,这个函数是一次性的喔,也就是说只能建立一颗二叉树,不能建立第二颗。缘由就出在了nIndex这个静态变量这里。若是你须要再建立一颗二叉树,那么再建立以前须要将nIndex赋为0。io

若是换作非递归的方式建立,就没有这个问题了。可是非递归建立稍微复杂一点点,须要用到栈stack。class

原理很简单:变量

0、判断Value是否等于‘#’,若是是:执行第5步;不然:执行第1步原理

一、建立节点二叉树

二、判断栈是否为空,若是为空:执行第4步;不然:执行第3步static

三、判断方向是否为Left,若是是:栈顶元素的左孩子等于第1步建立的节点,执行第4步;不然:栈顶元素的右孩子等于第1步建立的节点,删除栈顶元素,方向改成左,执行第4步。

四、节点入栈

五、判断方向是否等于右,若是是:删除栈顶元素;若是不是:将方向改成右

具体代码以下:

// 先序建立
TEMPTYPE bool CBinaryTree<type>::FirstOrderCreate(__in const type* pValue, __in UINT nSize)
{
	if (!pValue || !nSize)return false;
	const type* pTempValue = pValue;
	stack<LPTREENODE>* pStack = new stack<LPTREENODE>;
	bool IsDirection = true;// true:左 false:右

	// 建立子节点
	while (*pTempValue)
	{
		while (*pTempValue != m_Make/*m_Make等于‘#’号*/){
			// 建立子节点
			auto p = new TREENODE;
			memset(p, 0, sizeof(TREENODE));
			p->m_Data = *pTempValue;

			// 挂在左/右节点
			if (!pStack->empty()){
				if (IsDirection){// 栈顶左节点
					pStack->top()->m_pLeftChild = p;
				}
				else{// 栈顶右节点,子树建立完成,删除栈顶元素,方向变为左,既建立左节点
					pStack->top()->m_pRightChild = p;
					pStack->pop();
					IsDirection = true;
				}
				// 节点入栈
				pStack->push(p);
			}
			else {// 栈空,既跟节点
				m_pTree = p; 
				pStack->push(p);
			}
			pTempValue++;
		}
		pTempValue++;
		// 若是方向为右,删除栈顶元素;不然方向变为右
		if (!IsDirection){ pStack->pop();}
		else IsDirection = false;
	}
	delete pStack;
	return true;
}  
相关文章
相关标签/搜索