剑指offer-面试题61-按之字形顺序打印二叉树
来源:互联网 发布:最新网络歌曲情歌对唱 编辑:程序博客网 时间:2024/06/05 19:20
二叉树节点结构定义:
package case62_PrintTreeInZigzag;/** * 定义二叉树节点结构 * * @author WangSai * */public class MyNode {int data;MyNode lchild;MyNode rchild;public MyNode() {// TODO Auto-generated constructor stub}public MyNode(int data) {this.data = data;}}
代码实现题目要求:
package case62_PrintTreeInZigzag;import java.util.Stack;/** * 题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二行按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, * 其他行以此类推。例如按照之字形打印下图二叉树的结果为: * * 1 * * 3 2 * * 4 5 6 7 * * 15 14 13 12 11 10 9 8 * * ..............1............................................................... * ........../.......\............................................................ * .........2..........3........................................................... * ......./...\....../....\........................................................ * ......4.....5....6......7....................................................... * ..../..\../..\../..\..../...\................................................... * ...8...9.10..11.12..13.14....15................................................. * * @author WangSai * */public class PrintTreeInZigzag {/** * 利用两个辅助栈,其中一个保存奇数行节点,另一个保存偶数行节点。 * 奇数行节点按照从左到右打印,则需要按照从右到左入栈。偶数行节点数据按照从右到左打印,则需要按照从左到右入栈。 * * @param root,待打印二叉树的根节点 */private void myPrint(MyNode root) {// 异常值检测if (root == null)throw new IllegalArgumentException("非法输入参数,请重新检查...");// 创建两个容器分别保存奇数行和偶数行数据Stack<MyNode> stackOdd = new Stack<>();Stack<MyNode> stackEven = new Stack<>();stackOdd.push(root);// 创建两个变量,countToBePrint当前行待打印的元素数量;countNextRows下一行的元素数量int countToBePrint = 1;int countNextRows = 0;// 当两个栈都不为null时,说明二叉树还未处理完成。while (!stackOdd.empty() || !stackEven.empty()) {MyNode tempNode = new MyNode();// stackOdd出栈奇数行数据节点,并且打印出栈节点的数据;stackEven入栈偶数行结点while (countToBePrint > 0) {// stackOdd出栈,并打印出栈节点的数据,当前行待打印的元素数量-1,tempNode = stackOdd.pop();System.out.print(tempNode.data + " " + '\t');countToBePrint--;// 把偶数行压栈,并且压入节点之后,元素数量增加。if (tempNode.lchild != null) {stackEven.push(tempNode.lchild);countNextRows++;}if (tempNode.rchild != null) {stackEven.push(tempNode.rchild);countNextRows++;}}// 打印完一行之后,换行System.out.println();countToBePrint = countNextRows;countNextRows = 0;// stackEven出栈,并且打印出栈节点的数据,stackOdd入栈while (countToBePrint > 0) {tempNode = stackEven.pop();System.out.print(tempNode.data + " " + '\t');countToBePrint--;// 把奇数行节点压栈,并且压入节点之后,元素数量增加。if (tempNode.rchild != null) {stackOdd.push(tempNode.rchild);countNextRows++;}if (tempNode.lchild != null) {stackOdd.push(tempNode.lchild);countNextRows++;}}// 打印完一行之后,换行System.out.println();countToBePrint = countNextRows;countNextRows = 0;}}/** * @param args */public static void main(String[] args) {System.out.println("test1() :");test1();System.out.println("test2() :");test2();System.out.println("test3() :");test3();}// 满二叉树// ..............1...............................................................// ........../.......\............................................................// .........2..........3...........................................................// ......./...\....../....\........................................................// ......4.....5....6......7.......................................................// ..../..\../..\../..\..../...\...................................................// ...8...9.10..11.12..13.14....15.................................................private static void test1() {PrintTreeInZigzag ptiz = new PrintTreeInZigzag();MyNode root = new MyNode(1);MyNode N2 = new MyNode(2);MyNode N3 = new MyNode(3);MyNode N4 = new MyNode(4);MyNode N5 = new MyNode(5);MyNode N6 = new MyNode(6);MyNode N7 = new MyNode(7);MyNode N8 = new MyNode(8);MyNode N9 = new MyNode(9);MyNode N10 = new MyNode(10);MyNode N11 = new MyNode(11);MyNode N12 = new MyNode(12);MyNode N13 = new MyNode(13);MyNode N14 = new MyNode(14);MyNode N15 = new MyNode(15);root.lchild = N2;root.rchild = N3;N2.lchild = N4;N2.rchild = N5;N3.lchild = N6;N3.rchild = N7;N4.lchild = N8;N4.rchild = N9;N5.lchild = N10;N5.rchild = N11;N6.lchild = N12;N6.rchild = N13;N7.lchild = N14;N7.rchild = N15;ptiz.myPrint(root);}// 斜二叉树// ............8...............................................................// ........../.................................................................// .........6..................................................................// ......./.....................................................................// ......5......................................................................private static void test2() {PrintTreeInZigzag ptiz = new PrintTreeInZigzag();MyNode root = new MyNode(8);MyNode N2 = new MyNode(6);MyNode N4 = new MyNode(5);root.lchild = N2;N2.lchild = N4;ptiz.myPrint(root);}// 普通二叉树// ............8...............................................................// ........../....\............................................................// .........6......10...........................................................// ......./..\..................................................................// ......5...7..................................................................private static void test3() {PrintTreeInZigzag ptiz = new PrintTreeInZigzag();MyNode root = new MyNode(8);MyNode N2 = new MyNode(6);MyNode N3 = new MyNode(10);MyNode N4 = new MyNode(5);MyNode N5 = new MyNode(7);root.lchild = N2;root.rchild = N3;N2.lchild = N4;N2.rchild = N5;ptiz.myPrint(root);}}
输出结果:
0 0
- 《剑指Offer》学习笔记--面试题61:按之字形顺序打印二叉树
- 【剑指Offer学习】【面试题61:按之字形顺序打印二叉树】
- 剑指offer-面试题61:按之字形顺序打印二叉树
- 剑指offer--面试题61:按之字形顺序打印二叉树
- 剑指offer-面试题61-按之字形顺序打印二叉树
- 剑指offer 面试题61 按之字形顺序打印二叉树
- 剑指offer面试题61 按之字形顺序打印二叉树(java实现)
- 【剑指Offer】面试题61:按之字形顺序打印二叉树
- 《剑指offer》Python语言 面试题61:按之字形顺序打印二叉树
- 剑指offer——面试题61:按之字形顺序打印二叉树
- 面试题61:按之字形顺序打印二叉树
- 面试题61:按之字形顺序打印二叉树
- 面试题61:按之字形顺序打印二叉树
- 面试题61:按之字形顺序打印二叉树
- 《剑指offer》:[61]按之字形顺序打印二叉树
- java面试题(剑指offer):之字形打印二叉树
- 面试题68:按之字形顺序打印二叉树
- 面试题61. 按之字形顺序打印二叉树
- Quagga Case 1
- 星星
- Android 出现00M
- 技术转型产品学习笔记与理解——第七天
- 记多年回归.....
- 剑指offer-面试题61-按之字形顺序打印二叉树
- FBX导入选项参考指南
- 12.[个人]C++线程入门到进阶(12)----读者写者问题&读写锁SRWLock
- 四无年轻人如何逆袭
- Map总结
- Linux系统清除缓存【整理】
- PowerOJ1180-矩阵快速幂
- Linux--RH134---unit 5 lvm管理
- 学习新框架