打印二叉树的边界节点 c++实现

来源:互联网 发布:盘古ios9.2 for mac 编辑:程序博客网 时间:2024/06/03 13:23

给定一颗二叉树的头结点,按照下面的规则实现二叉树的边界节点的逆时针打印。

  1. 头结点的边界节点
  2. 叶子节点为边界节点
  3. 如果节点在所在层的最左边或者最右边,那么也是边界节点

比如下图这棵树:
这里写图片描述

程序流程

1.得到二叉树上每一层最左和最右的节点,用上图的例子来说,这个记录过程如下:

- 最左节点 最右节点 第一层 1 1 第二层 2 2 第三层 4 6 第四层 7 10 第五层 11 12 第六层 13 16

2. 从上到下打印所有层找那个的最左节点,对上面的例子来讲,打印的顺序为:1,2,4,7,11,13。
3. 然后前序遍历二叉树,打印那些不属于某一层的最左或者最右的节点,但同时又是叶子节点,按照上面的例子来说打印的是:14,15。
4. 从下到上打印所有层中的最右的节点但不是最左节点的节点,对于上面的例子来说是:16,12,10,6,3

过程代码如下:

#include <cstdio>#include <iostream>using namespace std;struct Tree{    Tree* lson;    Tree* rson;    int data;};Tree* T;Tree* edgeMap[100+5][2];void createBtiTree(Tree* &tree){    int data;    cin>>data;    if(data==-1) {        tree=NULL;    }else {        tree = new Tree();        tree->data = data;        createBtiTree(tree->lson);        createBtiTree(tree->rson);    }}int getHeight(Tree* tree,int l){    if(tree==NULL) return l;    return max(getHeight(tree->lson,l+1),getHeight(tree->rson,l+1));}void setEdgeMap(Tree* h,int l){    if(h==NULL) return ;    if(edgeMap[l][0]==NULL) edgeMap[l][0] = h;    edgeMap[l][1] = h;    setEdgeMap(h->lson,l+1);    setEdgeMap(h->rson,l+1);}void printLeafNotInMap(Tree* h,int l){    if(h==NULL) return ;    if(h->lson==NULL  && h->rson==NULL && edgeMap[l][0]!=h && edgeMap[l][1]!=h) {        cout<<h->data<<" ";    }    printLeafNotInMap(h->lson,l+1);    printLeafNotInMap(h->rson,l+1);}void printEdge(Tree* tree){    int hei = getHeight(tree,0);    setEdgeMap(tree,0);    for(int i=0;i<hei;i++) cout<<edgeMap[i][0]->data<<" ";    printLeafNotInMap(tree,0);    while((--hei)>=0) if(edgeMap[hei][0]!=edgeMap[hei][1]) cout<<edgeMap[hei][1]->data<<" ";    cout<<endl;}int main(){    freopen("in.txt","r",stdin);    createBtiTree(T);    printEdge(T);    return 0;}
0 0