交互二叉树的所有左子树和右子树.

  递归实现:

真正对递归的调用过程很熟悉的哥们才很顺,虽然这个题目代码看起来不难,但是我在纸上画出调用过程后,才弄明白是什么个过程.

 1 //交换所有二叉树的左子树和右子树.
 2 void
 3 swap(PNode p) {
 4     if(!p)    return;
 5
 6     swap(p->lchild);
 7     swap(p->rchild);
 8
 9     PNode t;
10     t = p->lchild;
11     p->lchild = p->rchild;
12     p->rchild = t;
13     return;
14 }
时间: 2024-11-08 23:48:33

交互二叉树的所有左子树和右子树.的相关文章

二叉苹果树(由根分为左子树和右子树两部分情况)

有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点.这棵树共  个节点,标号  至 ,树根编号一定为 . 我们用一根树枝两端连接的节点编号描述一根树枝的位置.一棵有四根树枝的苹果树,因为树枝太多了,需要剪枝.但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果. 输入格式 第一行两个数 N和 Q,N 表示树的节点数, Q表示要保留的树枝数量. 接下来 N-1行描述树枝信息,每行三个整数,前两个是它连接的节点的编号,第三个数是这根树枝上苹果数量. 输出格式 输

15.输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点, 用递归和循环两种方法完成树的镜像转换

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4260432.html  声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点, 用递归和循环两种方法完成树的镜像转换. 题目分析:

【转】将一棵树转换为二叉树后,为什么根节点没有右子树

树转化为二叉树时结点左子树是原来的孩子结点,右子树是原来的兄弟结点.即取根节点左孩子向右连接他的兄弟结点(在同一层次的节点,原来互不相连)并把它的子树,而把除左孩子外,原来与根节点相连的线擦除.这样根节点没有右孩子,因为由树转化来的二叉树某个节点A的左子树是原来作为树时A的孩子,其右子树是他的兄弟. 原文地址:https://www.cnblogs.com/schips/p/10630811.html

!HDU 4359 左子树节点和小于右子树的树有多少种-dp

题意:n个节点,每个节点的权值为2^0,2^1....2^(n-1),求满足任何节点的左子树的节点和小于右子树的节点和的分配方案有多少种 分析: 由于等比数列的性质:1+2+....2^(k-1)<2^k,所以除了根节点的权值以外的,最大值必须在右子树,其余节点随意. 情况有:1.只有左子树,2.只有右子树,3.都有 dp[i][j]:表示选i个节点深度<=j的树的分配方案 转移:dp[i][j]+=C(i-2,k)*dp[k][j-1]*dp[i-1-k][j-1],这里用到了组合数性质,或

二叉树进阶之寻找一棵二叉树中的最大二叉搜索子树

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6618915.html  (规律:在二叉树中寻找某性质的,都应该以递归思维:从根结点开始递归左右,一直到底,由底向上返回的信息来判断当前结点.求当前结点.即:二叉树的题目,从下往上想,递归的返回过程就是从下往上由叶到根建立二叉树的过程,在此过程中对每一步的"根"结点作性质判断,返回到根时即是整棵树的性质判断了) 从一棵树中寻找结点数最多的二叉搜索子树,并返回这棵子树的头结点. 从题目我们知道以下要求

Oracle左连接、右连接、全外连接以及(+)号用法(转)

Oracle  外连接(OUTER JOIN) 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/FULL OUTER JOIN. 通常省略OUTER关键字, 写成:LEFT/RIGHT/FULL JOIN. 在左连接和右连接时都会以一张A表为基础表,该表的内容会全部显示,然后加上A表和B表匹配的内容. 如果A表的数据在B表中没有记录. 那么在相关联的结果集行中列显示为空值(NULL). 对于外连接, 也可以使用“(+)

(C++)关于i++和i++的左值、右值问题

1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值,但右值不可以是左值. 因此也只有左值才能被取地址. 2.举两个问题: int i = 0; (i++)+=i; //错误 (++i)+=i; //正确 int *ip = &(i++); //错误 int *ip = &(++i); //正确 3.为什么i++不能作左值? 我们来看i++和i

c++中的左值与右值

++(a++) a++相当于 int a; { int temp=a; a++; teturn temp; } 所以我们可以将++(a++)看成++temp;而temp 显然是一个右值,所以不能用啊~~ L-value中的L指的是Location,表示可寻址.The "l" in lvalue can be though of as locationR-value中的R指的是Read,表示可读.The "r" in rvalue can be thought of

OpenGL ES平移矩阵和旋转矩阵的左乘与右乘效果

OpenGL ES平移矩阵和旋转矩阵的左乘与右乘 在OpenGL .OpenGL ES中矩阵起着举足轻重的作用,而矩阵之间的左乘与右乘在效果上是不同的. 一.先平移后旋转 场景效果:人绕树旋转. 原理:以树为参考点,首先将人平移到树坐标系的指定位置(平移矩阵),然后旋转一定角度(旋转矩阵). 公式: pos = (matRotate * matTrans * vec4(pos,1.0)).xyz; 其中matRotate表示旋转矩阵: matTrans表示平移矩阵: pos表示三维世界的坐标.