• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 二叉树结点位置对调的问题

二叉树结点位置对调的问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了二叉树结点计算,二叉树结点,完全二叉树结点计算,二叉树叶子结点算法,某二叉树共有7个结点等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:二叉树结点位置对调的问题
描述:

一个二叉树, 普普通通的二叉树, 结点是这样定义的:

typedef struct node_t {
    struct node_t* parent;
    struct node_t* left;
    struct node_t* right;

    int data;
} node;

再简单不过了, 现在递归创建一个二叉树. 假设现在的二叉树是左边这样的, 对调之后是右边这样的.

     1                    1
    / \                  / \
   /   \                /   \
  2     3              8     3
 / \   /              / \   /
4   5 6     ---->    4   5 6   
   / \                  / \
  9   8                9   2
 /                    /
0                    0

要求一个函数 void swap(node* a, node* b), swap不能直接对调data:

// two和eight是内定的, 不要在意这些细节
printf("%d %d %d\n", two->data,
        eight->data,
        eight->right); // 2 8 0
swap(two, eight);
printf("%d %d %d\n", two->data,
        eight->data,
        eight->right->data); // 2 8 5

求一个, 多种/好的解法, 算法小白真心求教...


解决方案1:

void swap_p( pTree *a, pTree *b){
    pTree tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

void swap(pTree a, pTree b){
    pTree tmp_left,tmp_right,tmp_parent;

    //swap parent's pointer
    if( a->parent->left == a)
        a->parent->left = b;
    else
        a->parent->right = b;

    if( b->parent->left == b)
        b->parent->left = a;
    else
        b->parent->right = a;

    //swap child's pointer
    if( a->left != NULL){
        a->left->parent = b;
    }
    if( a->right != NULL){
        a->right->parent = b;
    }

    if( b->left != NULL){
        b->left->parent = a;
    }
    if( b->right != NULL){
        b->right->parent = a;
    }

    //swap themselves pointer
    swap_p( &(a->parent), &(b->parent));
    swap_p( &(a->left), &(b->left));
    swap_p( &(a->right), &(b->right));
}

解决方案2:

void swap(node* a, node* b)
{
    // 处理a与b相邻的情况,
    // 基本思路:将a指向b的邻边指向自己,将b指向a的邻边指向自己,交换的时候就不会出错
    if (a->left == b){
        a->left = a;
        b->parent = b;
    }
    else if (a->right == b){
        a->right = a;
        b->parent = b;
    }
    else if (a->parent == b) {
        a->parent = a;
        if (b->left == a)
            b->left == b
        else
            b->right == b;
    }

    node* tmp = b->parent;
    b->parent = a->parent;
    a->parent = tmp;
    tmp = b->right;
    b->right = a->right;
    a->right = tmp;
    tmp = b->left;
    b->left = a->left;
    a->left = tmp;
}


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 3个结点的有序树和无序树有几种形态
  • 二叉树结点位置对调的问题

相关文章

  • 2017-06-07 python网络爬虫中文乱码问题
  • 2017-06-07 新人按着flask教程一步一步的走,报错求指导
  • 2017-06-07 flask经常报奇怪的错误
  • 2017-06-07 pos机怎么用用pos作为DFS函数的参数是什么意思?
  • 2017-06-07 多级目录下的内容上传解决方案
  • 2017-06-07 求牛,自定义域名的问题???
  • 2017-06-07 javascrip字符串转数组
  • 2017-06-07 关于使用redis防高并发超中奖品设置过期时间的一个疑问
  • 2017-06-07 failedtolazilyinitializeacollectionofrole问题的解决
  • 2017-06-07 python利用urllib抓html源码后,字符串匹配问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 将flask部署到新浪云的问题
    • 看Pythoncookbook时有个疑惑,有关heapq的优先级队列
    • 请教Perl调用exe程序的问题
    • 七牛怎么了。。。。。
    • 安卓开发,如何通过intent传递图片+文字到微信?
    • 请问:如何在excel中正确使用SQL的查询语句
    • 想翻译一本JBoss的资料——《JBossAS5Development》
    • laravellaravel的“门面”和“契约”的问题
    • 七牛镜像存储
    • 七牛上传apk文件下载的apk的md5与原先的不一致

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有