树的存储结构

typedef char ElemType;
typedef struct BiTNode
    { ElemType data;
       struct BiTNode *lchild,*rchild;
    }BiTNode, *BiTree;

代码实现

传入的参数T表示你要进行交换的二叉树根节点地址

BiTree BiTreeChange(BiTree T)
// 参数:二叉树根指针T
// 返回:二叉树根指针
{
    BiTree pn,t1,t2;
	if(T!=NULL&&(T->lchild!=NULL||T->rchild!=NULL))
    {
        t1=BiTreeChange(T->lchild);
        t2=BiTreeChange(T->rchild);
        T->lchild=t2;
        T->rchild=t1;
        // pn=t1;
        // t1=t2;
        // t2=pn; 如果只是这样交换,是无法
        //改变左右孩子的,应该去改变T->lchild以及T->rchild
    }
     return T;
}

算法分析(递归生成)

  1. 首先,进行交换的条件,根节点首先不为空,为空的话是没有左右孩子的,也没有交换的必要了,其次即使根节点不为空,但其没有左右孩子,也就是叶节点,那么这样的结点也没有交换的必要,所以此处的条件为 T!=NULL&&(T->lchild!=NULL||T->rchild!=NULL)
  2. 在先决条件下,递归进行交换,如果他有左右孩子,那么就继续向下前进,直到不满足先决条件时,返回此时其结点的地址T,用t1保存,退出上一层函数,返回上一层递归继续进行下面的右孩子的递归,同样的得到其右孩子结点的地址T,用t2保存,然后分别进行交换,以此递归进行交换。完成二叉树左右子树 的交换。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐