首页 > 编程语言 >二叉树交换左右子树递归以及非递归算法

二叉树交换左右子树递归以及非递归算法

时间:2022-11-20 19:37:45浏览次数:41  
标签:lchild 结点 子树 递归 入队 二叉树 rchild null

递归方式基本思想:

  • 1、当待处理节点非空时,判断其左右孩子是否不同时为空:若是,转到2、否则分别递归调用左右子树进行操作。
  • 2、新建一个辅助结点,执行交换操作。
  • 3、递归调用非空的左右子树进行操作。
BiTree *exchangeChild(BiTree *&T){
	if(T==null) return null;//当结点为null直接return null
	if(T->lchild!=null||T->rchild!=null){//当待处理结点左右孩子不同时为空时交换
		BiTNode *temp=T->lchild;//辅助结点,用于交换
		T->lchild=T->rchild;
		T->rchild=temp;
	}
	//递归交换左右子树
	exchangeChild(T->lchild);
	exchangeChild(T->rchild);
	return T;
}

非递归方式基本思想:

需要利用队列进行操作:

  • 1、当待处理结点非空时入队。
  • 2、当队非空时,转到3、,否则代表操作完成,直接return 根结点。
  • 3、队头元素出队,判断其左右孩子是否不同时为空:若是,转到4、否则将非空的左右孩子依次入队,执行2、。
  • 4、新建一个辅助结点,执行交换操作。并将非空的左右孩子依次入队,执行2、。
BiTree *exchangeChild(BiTree *&T){
	BiTNode *temp;              //辅助结点,用于交换结点
	BiTNode *Ans=T;             //保存根结点
	InitQueue(Q);               //利用队列实现,初始化队列
	if(T!=null) EnQueue(Q,T);   //当结点不为空时入队
	while(!IsEmpty(Q)){         //当队非空时
		DeQueue(Q,T);       //队首元素出队
		if(T->lchild!=null||T->rchild!=null){//当队首元素的左右孩子不同时为空时执行交换操作
			temp=T->lchild;
			T->lchild=T->rchild;
			T->rchild=temp;
		}
		//对非空的孩子结点入队,继续执行上述操作
		if(T->lchild!=null){
			EnQueue(Q,T->lchild);
		}
		if(T->rchild!=null){
			EnQueue(Q,T->rchild);
		}
	}
	return Ans;//返回根结点
}
                             若有错误,欢迎指正
                              我们一起进步!

标签:lchild,结点,子树,递归,入队,二叉树,rchild,null
From: https://www.cnblogs.com/ucas-2023-An/p/16909250.html

相关文章

  • 递归删除大于30天的旧日志
    /***递归删除大于30天的旧日志*/privatestaticvoiddeleteOldLogFiles(Filedir){if(dir.isDirectory()){File[]files=dir.lis......
  • Leetcode 799.香槟塔:动态规划+递归
    香槟塔:动态规划+递归题目来源:Leetcode22/11/20每日一题:799.香槟塔https://leetcode.cn/problems/champagne-tower我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻......
  • 每日算法之判断是不是平衡二叉树
    JZ79判断是不是平衡二叉树描述输入一棵节点数为n二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balan......
  • 利用递归求两个数的最大公约数
    #include<stdio.h>inthcf(intn1,intn2);intmain(){intn1,n2;printf("输入两个正整数:");scanf("%d%d",&n1,&n2);printf("%d和%d的最大公约数......
  • 逆向递归加正向递归,将无规则树 重建成一棵完整的树
    逆向递归加正向递归,将无规则树重建成一棵完整的树背景后台在一个部门树上任意勾选,然后前端需要知道勾选后重新生成的树,没有父级的找上级依次类推。最近递归写的......
  • 遍历二叉树和线索二叉树
    遍历二叉树:   L:左D:根 R:右    DLR-先根遍历    LDR-中序遍历    LRD-后序遍历  要求:给一棵二叉树,写出它的三种遍历顺序   ......
  • 二叉树的性质和存储结构
    性质:在二叉树的第i层最多有2^(i-1)个结点(i>=1)深度为k的二叉树最多有2^k-1个结点(运用等比求和)对任何一棵二叉树T,如果叶子数为n0,度为2的结点数为n2,则n0=n2+1(根据二叉......
  • 二叉树的前、中、后序遍历(迭代版)
    //前序遍历顺序:中-左-右,入栈顺序:中-右-左classSolution{publicList<Integer>preorderTraversal(TreeNoderoot){List<Integer>result=newArrayL......
  • 82:递归函数_阶乘计算案例
    【操作】使用递归函数计算阶乘(factorial)deffactorial(n):ifn==1:return1returnn*factorial(n-1)foriinrange(1,6):print(i,......
  • 81:递归函数_函数调用内存分析_栈帧的创建
    ###递归函数递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类似于大家中学数学学习过的“数学归纳法”。每个递归函数必须包含两个部分:1.......