二叉树的访问

论坛 期权论坛 期权     
匿名   2018-4-26 13:42   7793   4
节点如下:
struct BTNode{
    struct BTNode* pLchild;
    struct BTNode* pRchild;
    int data;
};
求二叉树中第k层,第m个节点
BTNode*  visit(BTNode* p/*树的根*/,int k, int m);
实现这个函数(注意:是二叉树,非完全二叉树)
分享到 :
0 人收藏

4 个回复

倒序浏览
2#
热心网友  15级至尊 | 2018-4-30 02:31:57 发帖IP地址来自
这是我的思路和算法伪代码,是可行的:

      已知有队列的数据结构Queue,存储二叉树的节点,EnQueue是入队列函数,DeQueue是出队列函数,IsEmpty是判断队列是否为空的函数,InitQueue是初始化队列函数。

      算法思想是:对二叉树采用按层次遍历的方法,将第i层和第i+1层节点分别存入两个队列中,当某一层的序号恰好是k时,再在队列中顺序查找第m个元素。

BTNode*  visit(BTNode* p, int k, int m)
{
    int level;            /* 当前节点的层次(1..*) */
    int seq;              /* 当前节点在当前层的序号(1..*) */
    BTNode *curr;
    Queue Q1, Q2;
    Q1 = InitQueue();     /* 初始化队列 */
    Q2 = InitQueue();

    EnQueue(Q1, p);       /* 根节点入队列 */
    for(level=2; levelpLchild != NULL)
                EnQueue(Q2, curr->pLchild);
            if(curr->pRchild != NULL)
                EnQueue(Q2, curr->pRchild);
        }
        if(IsEmpty(Q2))
        {
            printf("二叉树不足k层");
            exit(-1);
        }
        /* 交换Q1、Q2 */
        while(!IsEmpty(Q2))
        {
            DeQueue(Q2, curr);
            EnQueue(Q1, curr);
        }
    }

    /* 从队列Q1中顺序查找第m个元素 */
    for(seq=1; seq
3#
热心网友  15级至尊 | 2018-4-30 02:31:58 发帖IP地址来自
这个问题我以前回答过了
凑合着看吧

很显然你还不懂的遍历一棵二叉树的原理
当你拿到一棵二叉树,无论它的形状如何的千奇百怪
我们都可以将它按照如下的方式划分
       根
    /      \
左子树    右子树
一棵有很多个节点的二叉树可以划分为以上的形式
也可以这么理解,只要是按以上形式组合的都可以称为是二叉树
一个仅仅只有根节点的二叉树也可以划分成以上的形式,只不过他的左右子树都为空罢了
所以,我们发现,二叉树的定义其实是一个递归定义的过程
大的二叉树是由小的二叉树构建而成的
所以,当我们考虑要遍历一棵二叉树时
也是首选递归的遍历
遍历二叉树
它的基本思想是先按照上面的形式把整棵二叉树划分为3部分
哪么接下来的工作就很简单了
我们只需要将这3部分都遍历一遍就可以了(这里用到了分而治之的思想)
而对于这3部分来说
根节点的遍历无疑是最方便的,直接访问就ok了
而对于左右子树呢?
我们不难发现,左右子树其实分别成为了两棵完整的树
他们拥有各自独立的根节点,左子树和右子树
对他们的遍历,很显然应该与刚才的遍历方法一致便可
(如果上面的都理解了,那么这个题就是小菜一碟了,如果觉得无法理解,可以按照下面的方法自己多分解几棵树)
对于这个题目,中序遍历这可二叉树
先看根节点
         1
     /        \
左子树      右子树
我们应该先遍历左子树
也就是下面这棵树
    2
  /   \
4       5
对于这棵树在进行中序遍历
我们应先遍历她的左子树
他只有一个根节点4,左右子树都为空
哪么遍历这个只有一个根节点的二叉树
先访问她的左子树,为空
返回
访问该树的根节点4
在访问右子树也为空
此时,这棵树已经被完全的遍历了
我们需要返回上一层也就是
    2
  /   \
4       5
这棵树
此时,她的左子树已经被访问完毕
根据中序遍历的规则
需要访问此树的根节点2
此时的访问顺序是4-2
访问了根节点
在访问右子树只有一个根节点的5(具体过程看4的访问)
5访问完毕
也就意味着
    2
  /   \
4       5
这棵树已经访问完了
需要返回上一层
也就是1为根的树
此时这棵树的左子树已经访问完毕
此时访问的顺序是4-2-5应该没有问题
接下来访问根节点1
在访问右子树
   3
  /   \
4       7
是不是觉得似曾相识???
她的访问应该跟
   2
  /   \
4       5
一致
哪么最终遍历的顺序也出来了
4-2-5-1-6-3-7

-----------------------------
花了10多分钟
希望对你有所帮助
顺便自己也复习下
呵呵

匿名 ??6-02 15:05


相关内容
4#
rqhuang  2级吧友 | 2018-4-30 02:31:59 发帖IP地址来自
5#
周丹嘉  1级新秀 | 2018-4-30 02:32:00 发帖IP地址来自
吧别人的复制一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:58388
帖子:6688
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP