二叉树家谱查找特定世代

此处的家谱结构为 左指针指向后代,右指针指向兄弟;
假设根节点存储的名字为张一;
整个树的结构如下:
《二叉树家谱查找特定世代》

那么第一世代为张一;
第二为二、三
第三为四五六七八
第四为九十十一;

从根节点出发,到达第n世代需要访问n-1次左结点,因此可用递归方式实现

void search_gener(node* root,int n) {
    if (n == 1) {
        cout << root->name << " ";
    }
    if (root->child != NULL) search_gener(root->child,n-1);
    if (root->brother != NULL) search_gener(root->brother,n);
}

n即为所要查找的世代,访问右结点(brother)时n不变,而child则n-1,这样总共访问了n-1次左结点后便会输出结果。
实际运行结果如下
《二叉树家谱查找特定世代》

对此函数稍加修改,还能达到查找某个人的第几代直系子女的效果;
例如我们如果要查找张二的第二代子女,那么输出为张九,第一代子女则为四 五 六;
此时需要给函数再增加一个参数count,因为我们不需要访问张二的brother结点张三,否则会将张三的子女也加入输出中。
代码如下:

void search_gener(node* root,int n,int count) {
    if (n == 1) {
        cout << root->name << " ";
        if (root->child != NULL) have_child = true;
    }
    if (root->child != NULL) search_gener(root->child,n-1,count+1);
    if (root->brother != NULL && count != 0) search_gener(root->brother,n,count);
}

这样便不会访问根节点的brother结点。

利用这个函数,还能完成遍历整个家谱以及查找某个人的所有后代的功能。

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/DerryYan/article/details/78519637
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞