设为首页 加入收藏

TOP

遍历二叉树的各种操作(非递归遍历)(四)
2015-02-02 14:15:40 来源: 作者: 【 】 浏览:34
Tags:各种 操作
----------|\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 !=

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇二叉树:后序遍历,递归和非递归.. 下一篇求二叉树深度,递归和非递归

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: