数据结构算法(八) 之 树的 2 道面试题 60 & 61

  • 剑指 Offer 面试题 60(Java 版):把二叉树打印成多行

题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。

思路:用一个队列来保存将要打印的结点。为了把二叉树的每一行单独打印到一行里,我们需要两个变量:一个变量表示在当前的层中还没有打印的结点数,另一个变量表示下一次结点的数目。

show my code

/**
 * 按行打印二叉树
 * @author innovator
 *
 */
public class PrintTree {

    /**
     * 按照层来打印二叉树
     * @param root
     */
    public static void printTreeByLine(BinaryTreeNode root){
        
        if(root == null){
            return;
        }
        
        //用队列来装遍历到的节点
        Queue<BinaryTreeNode> queue = new LinkedList<>();
        
        queue.add(root);
        //下一层节点数目
        int nextLevel = 0;
        //当前层中未被打印的节点数
        int toBePrinted = 1;
        
        while(!queue.isEmpty()){
            
            BinaryTreeNode current = queue.peek();
            //打印当前节点
            System.out.printf(" %d",current.value);
            
            //层序遍历
            if(current.leftNode != null){
                queue.add(current.leftNode);
                nextLevel ++;
            }
            
            if(current.rightNode != null){
                queue.add(current.rightNode);
                nextLevel ++;
            }
            
            //弹出当前节点,出队
            queue.poll();
            toBePrinted --;
            
            //当前层已经打印完毕
            if(toBePrinted == 0){
                //输出换行
                System.out.printf("\n");
                //从下层开始打印
                toBePrinted = nextLevel;
                nextLevel = 0;
            }
        }
    }
    
    
//                     8
//           6                    10
//      5         7          9          11
    public static void main(String[] args){
        BinaryTreeNode root =  new BinaryTreeNode(8);
        BinaryTreeNode node1 = new BinaryTreeNode(6);
        BinaryTreeNode node2 = new BinaryTreeNode(10);
        BinaryTreeNode node3 = new BinaryTreeNode(5);
        BinaryTreeNode node4 = new BinaryTreeNode(7);
        BinaryTreeNode node5 = new BinaryTreeNode(9);
        BinaryTreeNode node6 = new BinaryTreeNode(11);
        
        root.leftNode = node1;
        root.rightNode = node2;
        node1.leftNode = node3;
        node1.rightNode = node4;
        node2.leftNode = node5;
        node2.rightNode = node6;
    
        printTreeByLine(root);
    }
}
结果
  • 剑指 Offer 面试题 61(Java 版):按之字形顺序打印二叉树

题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。

思路:按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。

show my code

/**
 * 按照之字顺序打印二叉树
 * @author innovator
 *
 */
public class PrintTreeByZHI {

    /**
     * 按照之字顺序打印二叉树
     * @param root
     */
    public static void printTree(BinaryTreeNode root){
        
        if(root == null){
            return;
        }
        
        //存放奇数层的结点
        Stack<BinaryTreeNode> stack1 = new Stack<>();
        //存放偶数层的结点
        Stack<BinaryTreeNode> stack2 = new Stack<>();
        
        //是否在打印奇数层
        int printFlag = 1;
        
        BinaryTreeNode current;
        
        stack1.push(root);
        //还有结点在栈中未打印
        while(!stack1.isEmpty() || !stack2.isEmpty()){
            
            if(printFlag == 1){
                current = stack1.pop();
            }else{
                current = stack2.pop();
            }
            
            System.out.printf(" "+ current.value);
            
            //将下一层的结点入栈
            if(printFlag == 1){
                //压入偶数栈
                //先左后右
                if(current.leftNode != null){
                    stack2.push(current.leftNode);
                }
                
                if(current.rightNode != null){
                    stack2.push(current.rightNode);
                }
            }else{
                //压入奇数栈
                //先右后左
                if(current.rightNode != null){
                    stack1.push(current.rightNode);
                }
                
                if(current.leftNode != null){
                    stack1.push(current.leftNode);
                }
                
            }
            
            
            //打印完了奇数层,轮到偶数层了
            //加了前面的判断是为了防止当下一行为空的时候,会跑进去打印换行,打印完了当前的栈才允许切换flag
            if(printFlag == 1 && stack1.isEmpty()){
                System.out.printf("\n");
                printFlag = 0;
            }
            
            //打印完了偶数层,轮到奇数层了
            if(printFlag == 0 && stack2.isEmpty()){
                System.out.printf("\n");
                printFlag = 1;
            }
        }
    }
    
//                  8
//          6                    10
//      5         7          9          11
    public static void main(String[] args){
        BinaryTreeNode root =  new BinaryTreeNode(8);
        BinaryTreeNode node1 = new BinaryTreeNode(6);
        BinaryTreeNode node2 = new BinaryTreeNode(10);
        BinaryTreeNode node3 = new BinaryTreeNode(5);
        BinaryTreeNode node4 = new BinaryTreeNode(7);
        BinaryTreeNode node5 = new BinaryTreeNode(9);
        BinaryTreeNode node6 = new BinaryTreeNode(11);
        
        root.leftNode = node1;
        root.rightNode = node2;
        node1.leftNode = node3;
        node1.rightNode = node4;
        node2.leftNode = node5;
        node2.rightNode = node6;
    
        printTree(root);
    }
}
结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265

推荐阅读更多精彩内容