| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2452 人关注过本帖
标题:如何遍历完全二叉树到第k层第i个节点?
取消只看楼主 加入收藏
卡卡小罗
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:334
专家分:131
注 册:2008-12-11
结帖率:100%
收藏
 问题点数:0 回复次数:3 
如何遍历完全二叉树到第k层第i个节点?
如何遍历一棵完全二叉树到指定的第k层的从左到右第i个节点?请高手赐教。
搜索更多相关主题的帖子: 二叉树 遍历 完全二叉树 数据结构 结点 
2008-12-11 20:40
卡卡小罗
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:334
专家分:131
注 册:2008-12-11
收藏
得分:0 
用链表存储。其实我是想用链表存储一个最大堆。提供插入,删除最大节点和初始化功能。

匣浅难羁宝剑锋 玉藏石中也玲珑
初试清啼长天破 云光凝碧远岚平
2008-12-13 17:44
卡卡小罗
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:334
专家分:131
注 册:2008-12-11
收藏
得分:0 
谢谢!你的方法我已经用在插入算法中了。
template<class T>
MaxHeap<T>& MaxHeap<T>::Insert(const T& x) {//把x插入到最大堆中
    int k = (int) (log(state) / log(2)) + 1;//树的层数,state是当前堆的节点数目
    int index = state - (int) (pow(2, k - 1) - 1);//最后节点的位置
    int p_index = index / 2 + 1;//父节点从左至右的位置
    BinaryTreeNode<T> *temp = new BinaryTreeNode<T> (x);
    last = temp;//last指针指向最后一个节点
    if (index == (int) (pow(2, k - 1))) {//当前层已满
        p_index = 1;//父节点设为当前层的第一个节点
        ConditionOrder(root, k, p_index, temp);
    } else
        ConditionOrder(root, k - 1, p_index, temp);
    return *this;
}

template<class T>
void MaxHeap<T>::ConditionOrder(BinaryTreeNode<T> *u, int k, int i,
        BinaryTreeNode<T> *temp) { //根据参数条件遍历堆
    //如果当前节点的子树有一为空,把temp设为其子树
    int half = (int) pow(2, k - 2);//堆的第k层应有节点总数的一半
    if (u->data < temp->data) {//要插入的元素比当前节点大
        Swap(u->data, temp->data);
    }
    if (!u->LeftChild || !u->RightChild) {//左右子树有一为空,在此加入节点
        if (!u->LeftChild) {//左子树为空
            u->LeftChild = temp;//加入新节点
            state++;//节点数目加1
        } else {//右子树为空
            u->RightChild = temp;
            state++;//节点数目加1
        }
    } else {
        if (i <= half)//左子树
            ConditionOrder(u->LeftChild, k - 1, i, temp);
        else
            //右子树
            ConditionOrder(u->RightChild, k - 1, i - half, temp);
    }
}

匣浅难羁宝剑锋 玉藏石中也玲珑
初试清啼长天破 云光凝碧远岚平
2008-12-14 14:04
卡卡小罗
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:334
专家分:131
注 册:2008-12-11
收藏
得分:0 
但是删除最大节点和初始化怎么实现呢?
对于删除最大节点,我定义了一个last指针,指向最后一个插入的节点,但是删除一次后,last指针的定位问题就不好办了...
哎... 我也知道最大堆用公式化描述更好些,可是规定用链表存储,没办法啊...

匣浅难羁宝剑锋 玉藏石中也玲珑
初试清啼长天破 云光凝碧远岚平
2008-12-14 14:16
快速回复:如何遍历完全二叉树到第k层第i个节点?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016607 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved