链接二叉树中同一层的节点

本文深入探讨了一种解决树节点层级链接问题的算法,通过递归方式实现,确保每个节点都能与其同一层的邻居节点建立连接。重点介绍了如何避免使用先左再右的递归方式,转而采用从右到左的递归策略来解决查找同层节点孩子的问题,以及在链接节点时的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题目之前做过了,但是由于思路不清晰,今天思路又卡了


比如:
           0
       1       2
   3      4         5
      6          7 

1->2
3->4->5
6->7

参考数据结构:
struct TREE_NODE
{
        TREE_NODE(int n) : nVal(n), pLft(NULL), pRgt(NULL), pSib(NULL)
        {}

        int nVal;
        TREE_NODE* pLft;
        TREE_NODE* pRgt;
        TREE_NODE* pSib;
};



对于每一个节点tnode,都要将其左右节点链接。如果没有右节点,则就要找和tnode同一层的节点,直到找到一个节点有左孩子或者右孩子,返回这个节点的孩子。

有一个问题要解决,在找和tnode同层的节点的孩子节点,必须保证tnode同层的所有节点已经链接了,用先左再右的递归不行,所以要用从右到左的递归。

TREE_NODE *find_next(TREE_NODE *root)
{
        while(root = root->pSib) {
                if(root->pLft || root->pRgt)
                        return root->pLft?root->pLft:root->pRgt;
        }
        return NULL;
}
void LinkLevelNodes(TREE_NODE *root)
{
        if(!root) return ;
        if(root->pLft)
                root->pLft->pSib = root->pRgt?root->pRgt:find_next(root);
        if(root->pRgt)
                root->pRgt->pSib = find_next(root);
        LinkLevelNodes(root->pRgt);
        LinkLevelNodes(root->pLft);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值