数据结构c/c++,递归实现二叉树左右子树交换

树的存储结构

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保存,然后分别进行交换,以此递归进行交换。完成二叉树左右子树 的交换。

你可能感兴趣的:(算法,数据结构,算法,c++,c语言)