【二叉树】多行打印二叉树和按之字形打印二叉树

来源:互联网 发布:工作总结工作计划知乎 编辑:程序博客网 时间:2024/06/03 13:01

问题一

问题描述
从上到下按层打印二叉树,同层的从左到右打印。打印多行。

分析:可以想到层次遍历,借助队列存储结点;但是要打印成多行,所以必须设计两个变量,来表示当前打印的行的个数,和下一行打印的个数。

void PrintBinaryTree(Node* pRoot){    if (pRoot == NULL)        return;    queue<Node*> q;    q.push(pRoot);    int nextLevel = 0;    int curLevel = 1;    while (!q.empty())    {        Node* pCur = q.front();        printf("%d ", pCur->val);        if (pCur->left != NULL)        {            ++nextLevel;            q.push(pCur->left);        }        if (pCur->right != NULL)        {            ++nextLevel;            q.push(pCur->right);        }        q.pop();        --curLevel;        //一行打印完        if (curLevel == 0)        {            printf("\n");            curLevel = nextLevel;            nextLevel = 0;        }    }}

问题二

问题描述
按之字形顺序打印二叉树,即第一行从左到右,第二行从右到左,第三行从左到右。。。。

这里写图片描述

这里写图片描述

分析

按之字形顺序打印二叉树,需要两个栈,来保存,因为每一行打印的顺序不同,奇数层存储到一个栈,偶数层存储到两一个栈中。。

打印某一行节点的时,应先把下一层的节点保存到栈中

定义两个栈 s1,s2;
打印的奇数层的话,先保存左子树,再保存右子树 到s1
打印的偶数层的话,先保存右子树,再保存左子树 到s2

void Pint(Node* pRoot){    if (pRoot == NULL)        return;    std::stack<Node*> s[2];    //控制访问哪个栈,    int cur = 0;    int next = 1;    s[0].push(pRoot);    while (!s[0].empty() || !s[1].empty())    {        Node* pNode = s[cur].top();        s[cur].pop();        printf("%d ", pNode->val);        if (cur == 0)        {            //打印奇数层,存储下一层,先左后右            if (pNode->left != NULL)                s[next].push(pNode->left);            if (pNode->right != NULL)                s[next].push(pNode->right);        }        else        {            //打印偶数层,存储下一层,先右后左。            if (pNode->right != NULL)                s[next].push(pNode->right);            if (pNode->left != NULL)                s[next].push(pNode->left);        }        //当前层,打印完        if (s[cur].empty())        {            printf("\n");            //感觉设计特的巧            cur = 1 - cur;            next = 1 - next;        }    }}
原创粉丝点击