----------|\n");?
? ? ? ? printf("? ? ? ? ? ? ? ? ? ? ? ? 请选择功能:");?
? ? ? ? scanf("%d",&k);?
? ? ? ? switch(k)?
? ? ? ? {?
? ? ? ? case 0:?
? ? ? ? ? ? printf("请建立二叉树并输入二叉树的根节点:");?
? ? ? ? ? ? CreateBiTree(&root);?
? ? ? ? ? ? break;?
? ? ? ? case 1:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? printf("递归先序遍历二叉树的结果为:");?
? ? ? ? ? ? ? ? PreOrder(root);?
? ? ? ? ? ? ? ? printf("\n");?
? ? ? ? ? ? }?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? case 2:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? printf("递归中序遍历二叉树的结果为:");?
? ? ? ? ? ? ? ? InOrder(root);?
? ? ? ? ? ? ? ? printf("\n");?
? ? ? ? ? ? }?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? case 3:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? printf("递归后序遍历二叉树的结果为:");?
? ? ? ? ? ? ? ? PostOrder(root);?
? ? ? ? ? ? ? ? printf("\n");?
? ? ? ? ? ? }?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? case 4:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? printf("非递归先序遍历二叉树:");?
? ? ? ? ? ? ? ? PreOrder_Nonrecursive1(root);?
? ? ? ? ? ? ? ? printf("\n");?
? ? ? ? ? ? }?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? case 5:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? printf("非递归中序遍历二叉树:");?
? ? ? ? ? ? ? ? InOrderTraverse1(root);?
? ? ? ? ? ? ? ? printf("\n");?
? ? ? ? ? ? }?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? case 6:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? printf("非递归后序遍历二叉树:");?
? ? ? ? ? ? ? ? PostOrder_Nonrecursive(root);?
? ? ? ? ? ? ? ? printf("\n");?
? ? ? ? ? ? }?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? case 7:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? printf("非递归层序遍历二叉树:");?
? ? ? ? ? ? ? ? //LeverTraverse(root);?
? ? ? ? ? ? ? ? LevelOrder(root);?
? ? ? ? ? ? ? ? printf("\n");?
? ? ? ? ? ? }?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? case 8:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? ? ? printf("这棵二叉树的深度为:%d\n",depth(root));?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? case 9:?
? ? ? ? ? ? if(root)?
? ? ? ? ? ? ? ? printf("这棵二叉树的结点个数为:%d\n",CountNode(root));?
? ? ? ? ? ? else?
? ? ? ? ? ? ? ? printf("? ? ? ? ? 二叉树为空!\n");?
? ? ? ? ? ? break;?
? ? ? ? default:?
? ? ? ? ? ? flag=0;?
? ? ? ? ? ? printf("程序运行结束,按任意键退出!\n");?
? ? ? ? }?
? ? }?
? ? system("pause");?
? ? return 0;?
}
运行效果图如下:

分别输入:
1
2
4
#
#
5
#
#
3
6
#
#
7
#
#?
就可以构造如下图所示的二叉树了。。

后序遍历非递归的另外一种写法:
/*
后序遍历由于遍历父节点是在遍历子节点之后,而且左节点和右节点遍历后的行为不一样,
所以需要用变量来记录前一次访问的节点,根据前一次节点和现在的节点的关系来确定具体执行什么操作
*/
void Postorder(BiTree T)
{
?if(T == NULL)
? return ;
?stack s;
?BiTree prev = NULL , curr = NULL;
?s.push(T);
?while(!s.empty())
?{
? curr = s.top();
? if(prev == NULL? || prev->lchild == curr || prev->rchild == curr)
? {
? ?if(curr->lchild != NULL)
? ? s.push(curr->lchild);
? ?else if(curr->rchild != NULL)
? ? s.push(curr->rchild);
? }
? else if(curr->lchild == prev)
? {
? ?if(curr->rchild != NULL)
? ? s.push(curr->rchild);
? }
? else
? {
? ?cout<data;
? ?s.pop();
? }
? prev = curr;
?}
}
输入二叉树中的两个节点,输出这两个结点在树中最低的共同父节点。
思路:遍历二叉树,找到一条从根节点开始到目的节点的路径,然后在两条路径上查找共同的父节点。
// 得到一条从根节点开始到目的节点的路径
bool GetNodePath(TreeNode *pRoot , TreeNode *pNode , vector &path)
{
?if(pRoot == NULL)
? return false;
?if(pRoot == pNode)
? return true;
?else if(GetNodePath(pRoot->lchild , pNode , path) )
?{
? path.push_back(pRoot->lchild);
? return true;
?}
?else if(GetNodePath(pRoot->rchild , pNode , path) )
?{
? path.push_back(pRoot->rchild);
? return true;
?}
?return false;
}
TreeNode *GetLastCommonNode(const vector &path1 , const vector &path2)
{
?vector::const_iterator iter1 = path1.begin();
?vector::const_iterator iter2 = path2.begin();
?TreeNode *pLast;
?while(iter1 !=