打印二叉树

首先根据前序和中序构造一棵二叉树,然后利用中序遍历和广度优先将树按照形状打印出来。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1000
/*
print the tree
first:using the preorder and inoder,create a tree
then print it using bst and preorder
*/
int i=1; //标记中序中的顺序
//队列的简单实现
struct node * queue[MAX];//队列 ,未考虑溢出
int head = 0;
int tail = 0;
struct node * dequeue(){
    struct node * temp = queue[head];
    head++;
    head %= MAX;
    return temp;

}
void enqueue(struct node * n){
    queue[tail] = n;
    tail++;
    tail %= MAX;
}
int isempty(){
    return (head == tail);
}

//树的实现
struct node {
    int key;
    int level; //表示该节点打印出来后距离最左侧的距离
    struct node * left;
    struct node * right;
}*root;
struct node * newNode(){
    struct node * temp= (struct node *)malloc(sizeof(struct node));
    memset(temp,0,sizeof(*temp));
    return temp;
}
//根据前序及中序序列,构造树,size表示树中总节点数
struct node * creatTree(char * inorder,char * preorder,int size){
    char * pos = inorder;
    struct node * root = newNode();
    int leftsize;
    if(size < 1){
        return NULL;
    }
    root -> key = *preorder;
    while(*pos != ‘\0‘ && *pos != *preorder)
        pos++;
    leftsize = pos - inorder;
    root -> left = creatTree(inorder,preorder+1,leftsize);
    root -> right = creatTree(pos+1,preorder+leftsize+1,size-1-leftsize);
    return root;
}
//中序遍历,并将节点level计算
void inOrder(struct node * root){
    if(root == NULL)
        return ;
    inOrder(root -> left);
    root -> level = i;
    i++;
    printf("%d ",root -> level);
    inOrder(root -> right);

}
//bfs
void bfs(struct node * root){
    struct node * last;
    struct node * curr;
    struct node * prev;
    int distance = 0;//上一个节点距离最左侧的距离
    last = root;
    enqueue(root);
    while(!isempty()){
        curr = dequeue();
        printf("%*c",curr->level - distance,curr -> key);
        distance = curr -> level;
        if(curr -> left != NULL){
            prev = curr -> left;
            enqueue(prev);
        }
        if(curr -> right != NULL){
            prev = curr -> right;
            enqueue(prev);
        }
        if(curr == last){
            printf("\n");
            last = prev;
            distance = 0;
        }

    }
}

int main(){
    char * inorder="123456";
    char * preorder="321456";
    root = creatTree(inorder,preorder,6);
    printf("inOrder:\n");
    inOrder(root);
    printf("\nBFS:\n");
    bfs(root);
    return 0;

}转载自:http://duanple.blog.163.com/blog/static/70971767200822411729791/
时间: 2024-11-03 21:35:37

打印二叉树的相关文章

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

从上往下打印二叉树(分层遍历)

从上往下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作,直到队列中所有的节点都被打印出来为止. struct TreeNode { int val; TreeNode* left; TreeNode* right; }; void LevelOrder(BinaryTreeNode* root) { if (roo

剑指Offer面试题23(Java版):从上往下打印二叉树

题目:从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图的二叉树,则一次打印出8,6,10,5,7,9,11. 这道题实质上考察的就是树的遍历算法,只是这种遍历不是我们熟悉的前序.中序或者后序遍历.由于我们不太熟悉这种按层遍历的方法,可能已下载也想不清楚遍历的过程. 因为按层打印的顺序决定应该先打印的根节点,所以我们从树的根节点开始分析.为了接下来能够打印8的结点的两个子节点,我们应该在遍历到该结点时把值为6和10的两个结点保存到一个容器中,现在容器内就有两个结点了.

打印二叉树节点数值总和等于某个给定节点的所有路径

打印二叉树节点数值总和等于某个给定节点的所有路径,路径可以从任意节点开始,任意节点结束. 比如,假设和是8,树如下 的路径有  [[5,3],[8],[5,1,2]].  5  / \ 3     1 /\     /\ 4  8  2   6 思路:遍历所有路径,对于每一个节点,在其路径中向后寻找sum和为target的路径加入到结果中. public List<List<Integer>> findSum(TreeNode root,int sum){ List<List

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩

算法笔记_189:历届试题 横向打印二叉树(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放入那个位置. 比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白. ...|-1210-|...|-8-|.......|...|-7.......|-5-|...........|-4 本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

剑指offer(五十三)之按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 代码: <span style="color:#000099;">import java.util.ArrayList; import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = n

Python实现打印二叉树某一层的所有节点

不多说,直接贴程序,如下所示 # -*- coding: utf-8 -*- # 定义二叉树节点类 class TreeNode(object): def __init__(self,data=0,left=0,right=0): self.data = data self.left = left self.right = right # 遍历某一层所有节点,并打印 def TransLevel(root,level): if root == None: return else: if leve

从上往下打印二叉树-剑指Offer

从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 数据结构:队列 将树按层遍历,先将根节点的左右子节点先后进入队列,然后再先后从队列取出,然后将取出的节点的左右子节点再入队列 循环进行,直到队列为空 代码 import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** public class TreeNode { int val = 0; Tree