C++中交换两个数/二叉树的建立

原创 2015年11月20日 19:47:47

我的个人博客:http://www.imekaku.com/2015/11/19/exchange-point-binarytree/

C++中利用指针交换两个数:

#include <iostream>
using namespace std;
 
void exchange(int*, int*);
void swap(int *, int *);
int main()
{
    int *p, *q;
    int a = 10;
    int b = 20;
 
    p = &a;
    q = &b;
     
    cout<<"交换前"<<endl;
    cout<<"p存放的地址是: "<<p<<endl;
    cout<<"q存放的地址是: "<<q<<endl;
 
    exchange(p, q);
 
    cout<<"交换之后"<<endl;
    cout<<"p存放的地址是: "<<p<<endl;
    cout<<"q存放的地址是: "<<q<<endl;
     
    swap(a, b);
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    return 0;
}
 
void exchange(int *p, int *q)
{
    int* temp;
    temp = p;
    p = q;
    q = temp;
    cout<<"交换过程中"<<endl;
    cout<<"p存放的地址是: "<<p<<endl;
    cout<<"q存放的地址是: "<<q<<endl;
}
 
void swap(int *p, int *q)
{
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}
 
/*
    输出结果:
    交换前
    p存放的地址是: 0023F7FC
    q存放的地址是: 0023F7F8
    交换过程中
    p存放的地址是: 0023F7F8
    q存放的地址是: 0023F7FC
    交换之后
    p存放的地址是: 0023F7FC
    q存放的地址是: 0023F7F8
    a = 20
    b = 10
*/

可以看到a和b的值确实是交换了,也就是说a和b空间存放的值发生了改变

是因为p,q利用他们存放的地址,改变了以这个值为地址的空间内的值,

但是p和q也只是作为参数传入函数,并不该改变p和q所存放的值。


【通俗的讲:】

好比有PQ两个Boss:

其中Q这个Boss有b这户人家的地址,Q就把这个地址告诉了小弟qQ传入函数的参数),

然后小弟q按照这个地址吧b这户人家给修理了一顿(改变了其中的值)。但是就算现在有谁来报复Q

也只能修理q, 而对Q毫发无损。

同样的P也修理了a这户人家。

这里的修理方式,交换了a, b两个的值。


* P, Q两个实参不会改变这一点很重要。


比如在二叉树的创建和遍历的工程中:

/*
    建立二叉树
    二叉树的遍历
    2015年11月18日11:27:58
*/
 
#include <iostream>
using namespace std;
 
/*二叉树结构体*/
struct BinaryTreeNode
{
    char data;
    BinaryTreeNode* theLeft;
    BinaryTreeNode* theRight;
};
 
/*
    创建一个二叉树
 
    这里的参数应该为二叉树的指针,因为需要定义出口
    即当输入的字符为'X'时,不在递归创建二叉树
 
    同时,需要要引用符&。
    在创建二叉树时,需要为二叉树分配空间,使用new方法
    T = new BinaryTreeNode;
    表示新开辟一个大小为BinaryTreeNode的空间,并将此地址赋值给T,
    如果不加引用符,那么T的值将不会改变,也就不能达到开辟空间的效果
*/
void createBinaryTreeNode(BinaryTreeNode* &T)
{
    char data;
    cin >> data;
    if(data == 'X')//这里不能使用双引号
        T = NULL;
    else
    {
        T = new BinaryTreeNode;
        T->data = data;
        createBinaryTreeNode(T->theLeft);
        createBinaryTreeNode(T->theRight);
    }
}
void visit(char data, int level)
{
    cout<<data<<" 在第 "<<level<<" 层"<<endl; } void crossBinaryTreeNode(BinaryTreeNode* T, int level) { if(T == NULL) return; else { visit(T->data, level);
        crossBinaryTreeNode(T->theLeft, level+1);
        crossBinaryTreeNode(T->theRight, level+1);
    }
}
 
/*
    释放空间时必须采用后序遍历,根节点必须在子节点释放之后才能被释放
    不然是找不到子节点的
*/
void deleteBinaryTreeNode(BinaryTreeNode* T)
{
    if(T == NULL)
        return;
    else
    {
        deleteBinaryTreeNode(T->theLeft);
        deleteBinaryTreeNode(T->theRight);
        delete T;
    }
}
 
int main()
{
    BinaryTreeNode* T = NULL;
    int level = 1;
 
    createBinaryTreeNode(T);
    crossBinaryTreeNode(T, level);
 
    deleteBinaryTreeNode(T);
    return 0;
}
 
/*
    结果:
    input:
    ABXDXXCEXXFXX
     
    output:
    A 在第 1 层
    B 在第 2 层
    D 在第 3 层
    C 在第 2 层
    E 在第 3 层
    F 在第 3 层
 
    图示:
           A    
          / \       
         B   C
         \  / \
          DE   F     
*/

如果创建二叉树时,不使用引用符,那么就不能成功的将new新开辟的空间的地址放在T中,就达不到创建二叉树的效果。

当然,在使用完成之后,还需要释放用new开辟的空间。

【数据结构与算法】二叉树给定两个节点的最短距离(C++实现)

问题描述对于普通的二叉树,求指定两节点的最短距离。两节点间的最短距离即指连接两节点需要的边的最小数量,对于下图:有如下结果:Dist(9, 11) = 4 Dist(8, 12) = 6 Dist(8...

判断两个二叉树是否相同(c++递归实现)

判断两棵二叉树是否为同一棵树,需要比较两个方面: 一:结构是否相同; 二:每个节点上的元素是否相同; 当二者都满足的时候才可判定二者为同一棵二叉树。 结构相同包括节点的个数以及每个节点上的子树...
  • Dr_S_
  • Dr_S_
  • 2017年11月26日 12:43
  • 61

二叉树:利用两个队列层次遍历输出指定层数的叶子节点

#include #include #include #include #define MAXSIZE 100 using namespace std; typedef struct bno...

建立遍历二叉树C++

  • 2014年11月15日 12:05
  • 1KB
  • 下载

C++二叉树的建立与遍历

从别处找来几个例子,感觉还可以,同学们拿回去看看吧,有什么地方不懂可以下可以后来实验室问我。//==========================================定义头部 #incl...

二叉树的建立、节点查找以及节点删除C和C++实现

程序是建立一颗二叉排序树,查找节点找到了返回其父节点,失败的时候返回NULL,删除节点分为四种情况:1、左子树和右子树都为空;2、左子树为空,右子树不为空;3、左子树不为空,右子树为空;4、左子树和右...

二叉树的建立与遍历(一)(c++实现)

【目标】建立如下所示的一棵二叉树,并且输出其对应的前序遍历、中序遍历、后序遍历。...

线索二叉树的建立与遍历C/C++

dzfdsf

二叉树的建立以及遍历C/C++

一、 二叉树的定义 二叉树(Binary Tree)是个有限元素的集合,该集合或者为空,或者由一个称为根(root)的元素及两个不相交的、分别被称为左子树和右子树的二叉树组成。当集合...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中交换两个数/二叉树的建立
举报原因:
原因补充:

(最多只允许输入30个字)