小代码 二叉树 添加树状打印及倒立打印

  //bug    last line can not swap with n-1
//http://www.zhihu.com/question/22547591/
 #include<iostream>
 #include<queue>
#include <queue>  
#include <vector>  
#include <list>  
#include <math.h> 
#include <cstdio> 
using namespace std;
  int ii=0;
int Find( char x,int size,int zeroIndex)
{
    switch (x)
    {
    case ‘s‘: //上移 就是找到零下面的那个数字的位置 也就是序号增加一行 也就是+4
        {
        if ( zeroIndex<size - 4)
        {
            return zeroIndex + 4;
        }
        }
        break;
    case ‘x‘: //下移
        {
//        if (zeroIndex<size-4 && zeroIndex>3)
        if (  zeroIndex>3)
        {
            return zeroIndex - 4;
        }
        }
        break;
    case ‘c‘: 
        {
        if ( zeroIndex%4!=0 )
        {
            return zeroIndex - 1;
        }
        }
        break;
    case ‘z‘:  //左移 主要是判断空白是否在右边缘
        {
        if (zeroIndex%4!=3)
        {
            return zeroIndex + 1;
        }
        }
        break;
    default:
        break;
    }   
    return -1;
}
 
 
//交换数组中zero和next的位置
void SwapIndex(int *ary,int zero, int next)
{
    if (-1 == next)
    {
        return ;
    }
    int t = ary[zero];
    ary[zero] = ary[next];
    ary[next] = t; 
}//DLR
 
void Update(int *ary, int size,char com)
{
    int zeroIndex = 0; //零的序号
    for (int i = 0.; i< size ; i++)
    {
        if (ary[i] == 0)
        {
            zeroIndex = i;
            break;
        }
    }
     
    int nextIndex = Find(com,size,zeroIndex); //获取跟零相邻(根据com不同 取上下左右)的那个数字的序号
    SwapIndex(ary,zeroIndex,nextIndex);
 
}
 
void Show(int *ary, int size)
{  ii++;
    for (int i  = 0 ; i <size; i++)
    {
        if(i % 4 == 0) //假设每行4个数字
        {
            cout<<endl<<endl;
        }
        if (ary[i]!=0)
        {
        cout<<"\t"<<ary[i];
        }
        else
        {
            cout<<"\t";
        }
    }
    //cout<<endl<<"请输入方向(1234):";
   cout<<endl<<"  "<<ii<<endl<<"请输入方向(sxzc):";
}
 
bool ProcessCommand(int *ary, int size,  char com)
{
   //    system("cls");
    Update(ary,size,com); //更新地图
    Show(ary,size); //显示新的地图
    return true;
}
 
 
char GetCommand() //假设只返回4个值 代表四个方向
{
//int test = 1;
char  test=‘s‘;
cin>>test;//先测试一下
return test;
}
 
 
void Process(int *ary, int size)
{
   /// int com = 0;
   char  com=‘s‘;
    while(ProcessCommand(ary,size,com))
    {
         com = GetCommand();    
    }
 
}
 
 
int pintu()
{
    int ary[16]; //数字0 代表空白
    for (int i=0;i<16; i++)
    {
        ary[i] = i;
    }
    Process(ary,16);
    return 0;
}

/////////////////////////////////////////////////////////////////////////

template<class T>  
struct Binary_node  
{  
    T data;  
    Binary_node<T>* left;  
    Binary_node<T>* right;  
    Binary_node();  
    Binary_node(const T &x);  
};  
    
template<class T>  
class Binary_tree  
{  
public:  
    Binary_tree():root(NULL){}; 
    Binary_tree(const Binary_tree<T>&original);  
    Binary_tree & operator=(const Binary_tree<T>&original); 
    ~Binary_tree();   
    bool empty() const;  
    void preorder(void (*visit)(T &));  /*/ DLR   /*/ 
    void inorder(void  (*visit)(T &));  /*/ LDR  /*/
    void postorder(void (*visit)(T &)); /*/ LRD  /*/ 
    int size() const;                       /*/ Binary_tree大小/*/      
    int height() const;  
    void clear();  
    void insert(const T& x);  
    void reverse();                         /*/ 镜像翻转 /*/
    const Binary_node<T>* get_root() const; 
    void leaf()
   {
    Binary_node<T> *b;
   cout<<"leaf number:"<<_leaf(root)+1<<endl;
   cout<<"and the leaf element :"<<endl;
while(!q.empty())
{
    b=q.front(); cout<<b->data<<" "<<endl;q.pop();
 }  
   }
 void createlay()
   {
    Binary_node<T>*cur=root;
    Binary_node<T>*p=root;
     queue<Binary_node<T>* > q;  
     Binary_node<T> *b;
    int f=1,r=0;
    T c;
    cin>>c;
    root=new Binary_node<T>; q.push(root);  root->data=c;
   while(c!=-1)
    {
       if(r%2==0)
              {root->left=new Binary_node<T>;  q.push(root->left);}
       else
              {root->right=new Binary_node<T>;  q.push(root->right);}
       if(r%2==1)f++;if(f%2==0)root=q.front(); q.pop();
      r++;
    cin>>c;
    }
   }  
void fun(int n)
{ 
int m=pow(2,n)-1; queue<int> p;
int i,j,k=0;
  n=n+1;
 while(n--)
 { m=pow(2,k+1)-1;
   for(i=0;i<m;i++)
  {
    if(i%2==0) p.push(k); 
    else      {p.push(p.front());p.pop();}
   }
  k++;
 }
  //the end only add pow(2,n)-2 number ;
 Binary_node<T> *b ;
  _fun(root);
  q.push(root);
//while((!p.empty())&&(!q.empty()))
while((q.size()>1))
{  p.pop();
for(i=0;i<p.front();i++)cout<<"*"; p.pop();
   q.pop(); 
   b=q.front();cout<<b->data<<" "<<endl;
    q.pop();
} 
 
}
   void createBiTree()
   {
    //Binary_node<T>*b=root;
   _createBiTree(root);
   }  
 
    void lay(int n)                         /*/ 层次打印 /*/
   {  //assert(root)
      int k=1; int m=1;int i=0;
      Binary_node<T> *b=root;
      queue<Binary_node<T>* > q;  
          q.push(b);  
    while(!q.empty())
  {
     b=q.front();  if(b->left) q.push(b->left); if(b->right) q.push(b->right);
     m=pow(2,k-1); for(i=0;i<n/2;i++) cout<<" ";cout<<b->data; q.pop();
     while(--m)
       {
        for(i=0;i<2*(n/2)+1;i++) cout<<" "; if(!q.empty()){ b=q.front();  if(b->left) q.push(b->left); if(b->right) q.push(b->right);cout<<b->data; q.pop();}
else cout<<"#";
       }
      cout<<endl;
      n=n/2; 
      k++;
   }
 

}

    //一些递归辅助函数  
private:      
    int recursive_size(const Binary_node<T>*root) const;  
    int recursive_height(const Binary_node<T>*root) const;  
    void equal(Binary_node<T>*&sub_root,const Binary_node<T>*orig_node);  
    void recursive_reverse(Binary_node<T> * & sub_root);  
    void recursive_clear(Binary_node<T> * & sub_root);  
    void recursive_insert(Binary_node<T> * & sub_root, const T& x);  
    void recursive_inorder(Binary_node<T> * sub_root, void (*visit)(T &));  
    void recursive_preorder(Binary_node<T> * sub_root, void (*visit)(T &));  
    void recursive_postorder(Binary_node<T> * sub_root, void (*visit)(T &)); 
    void _fun(Binary_node<T> * sub_root)
{
if(sub_root==NULL){q.push(root);  return;}
_fun(sub_root->right);
if(sub_root!=NULL) {q.push(sub_root);}
  
_fun(sub_root->left);
}
    int _leaf(Binary_node<T> * sub_root)
{ 
    if(NULL == sub_root) return 0;  
    if(NULL == sub_root->left&& NULL == sub_root->right)  
       { return 1;  q.push(sub_root);}
    return _leaf(sub_root->left) + _leaf(sub_root->right); 
}
 void _createBiTree(Binary_node<T> *&sub_root)
 {
    T c;  
    cin >> c;  
     
/*************/
  if(-1== c)  sub_root = NULL;  
    else  
    {  
        sub_root = new Binary_node<T>; 
        sub_root->data = c;  
        _createBiTree(sub_root->left);  
        _createBiTree(sub_root->right);  
    }  
 
/*************/ 
} 
protected:  
    Binary_node<T>* root;  
    queue<Binary_node<T>* > q;
    
};
////////////////////////////////////////////  

#ifndef BINARY_TREE_CPP_X  
#define BINARY_TREE_CPP_X  
  
template<class T>  
Binary_node<T>::Binary_node()  
{  
    left = right = NULL;  
}  
template<class T>  
Binary_node<T>::Binary_node(const T &x)  
{  
    left = right = NULL;  
    data = x;  
}  
template<class T>  
Binary_tree<T>::Binary_tree(const Binary_tree<T>&original)  
{  
    root = original.get_root();  
}  
template<class T>  
void Binary_tree<T>::recursive_preorder(Binary_node<T>*sub_root, void (*visit)(T&))  
{//先序遍历的递归函数  
    if (sub_root!=NULL)  
    {  
        (*visit)(sub_root->data);  
        recursive_preorder(sub_root->left, visit);  
        recursive_preorder(sub_root->right, visit);  
    }  
}  
template<class T>  
void Binary_tree<T>::preorder(void (*visit)(T&))  
{//先序遍历  
    recursive_preorder(root, visit);  
}
template<class T>  
void Binary_tree<T>::recursive_inorder(Binary_node<T>*sub_root, void(*visit)(T&))  
{//中序遍历的递归函数  
    if(sub_root!=NULL)  
    {  
        recursive_inorder(sub_root->left, visit);  
        (*visit)(sub_root->data);  
        recursive_inorder(sub_root->right, visit);  
    }  
}  
template<class T>  
void Binary_tree<T>::inorder(void (*visit)(T&))  
{//中序遍历  
    recursive_inorder(root, visit);  
}  
 
template<class T>  
void Binary_tree<T>::recursive_postorder(Binary_node<T>*sub_root, void (*visit)(T&))  
{//后序遍历的递归函数  
    if (sub_root!=NULL)  
    {  
        recursive_postorder(sub_root->left, visit);  
        recursive_postorder(sub_root->right, visit);  
        (*visit)(sub_root->data);  
    }  
}  
template<class T>  
void Binary_tree<T>::postorder(void (*visit)(T&))  
{//后序遍历  
    recursive_postorder(root, visit);  
}  
 
  
 
//return tree height, if only one node then return 1  
template<class T>  
int Binary_tree<T>::height() const  
{  
    return recursive_height(root);  
}  
#endif
#define max MAX  
template<class Comparable>  
Comparable MAX(const Comparable& a, const Comparable& b)  
{  
    return a > b ? a : b;  
}  
template<class T>  
int Binary_tree<T>::recursive_height(const Binary_node<T>*root) const  
{  
    if(root == NULL)  
        return 0;  
    else  
        return 1 + max(recursive_height(root->left) , recursive_height(root->right)) ;  
}  
#undef max  
 
//return the size of tree  
template<class T>  
int Binary_tree<T>::size() const  
{  
    return recursive_size(root);  
}  
template<class T>  
int Binary_tree<T>::recursive_size(const Binary_node<T>*root) const  
{  
    if(root == NULL)  
        return 0;   
    else  
        return 1 + recursive_size(root->left) + recursive_size(root->right) ;  
}  
//the tree is empty ?  
template<class T>  
bool Binary_tree<T>::empty() const  
{  
    return root == NULL;  
}  
//insert x to the tree  
template<class T>  
void Binary_tree<T>::insert(const T& x)  
{  
    recursive_insert(root, x);  
}  
//the recursive function of insert,  
//insert x in the less height side,  
//if both sides are same height then insert to the left  
//第一个参数必须使用引用否则插入失败,而其他不涉及数据改动的函数则不需要  
//引用传参时不会发生值拷贝,如果不加引用,会先在函数的栈空间拷贝一个root,但当函数  
//结束时这个拷贝就会被销毁,所以会导致插入失败  
template<class T>  
void Binary_tree<T>::recursive_insert(Binary_node<T>*&sub_root, const T& x)  
{  
    if(sub_root == NULL)  
    {  
        Binary_node<T>* ins_data = new Binary_node<T>(x);  
        sub_root = ins_data;  
        return;  
    }  
    else  
    {  
        if(recursive_height(sub_root->left) > recursive_height(sub_root->right))  
            recursive_insert(sub_root->right, x);  
        else  
            recursive_insert(sub_root->left, x);  
    }  
}  
 

template<class T>  
Binary_tree<T>::~Binary_tree()  
{  
    clear();  
}  
template<class T>  
void Binary_tree<T>::clear()  
{  
    recursive_clear(root);  
}  
/*/ recursive function for destroy tree /*/ 
template<class T>  
void Binary_tree<T>::recursive_clear(Binary_node<T>*&sub_root)  
{/*/两个版本都OK /*/ 
#if 0  
    if(sub_root != NULL)  
    {  
        recursive_clear(sub_root->left);  
        recursive_clear(sub_root->right);  
        delete sub_root;  
        sub_root = NULL;  
    }  
#else  
    if(sub_root->left!=NULL)  
        recursive_clear(sub_root->left);  
    if(sub_root->right!=NULL)  
        recursive_clear(sub_root->right);  
    delete sub_root;  
    sub_root = NULL;  
#endif  
}  
/*/  get the root /*/ 
template<class T>  
const Binary_node<T>* Binary_tree<T>::get_root() const  
{  
    return root;  
}  
/*/ deep copy /*/ 
template<class T>  
Binary_tree<T>& Binary_tree<T>::operator =(const Binary_tree<T>&original)  
{  
    equal(root, original.get_root());  
    return *this;  
}  
template<class T>  
void Binary_tree<T>::equal(Binary_node<T>*&sub_root,const Binary_node<T>*orig_node)  
{  
    if(empty())  
        sub_root = new Binary_node<T>(orig_node->data);  
    if(orig_node->left!=NULL)  
    {  
        sub_root->left = new Binary_node<T>(orig_node->left->data);  
        equal(root->left, orig_node->left);  
    }  
    if(orig_node->right!=NULL)  
    {  
        sub_root->right = new Binary_node<T>(orig_node->right->data);  
        equal(root->right, orig_node->right);  
    }  
}  
 
template<class T>  
void Binary_tree<T>::reverse()  
{  
    recursive_reverse(root);  
}  
template<class T>  
void Binary_tree<T>::recursive_reverse(Binary_node<T> * & sub_root)  
{  
    if(sub_root!=NULL)  
    {  
        Binary_node<T>* temp = NULL;  
        temp = sub_root->left;  
        sub_root->left = sub_root->right;  
        sub_root->right = temp;  
        recursive_reverse(sub_root->left);  
        recursive_reverse(sub_root->right);  
    }  
}  
 
 
  void test10()
{
Binary_tree<int> dd;  
//dd.createBiTree(); 
dd.createlay();
dd.lay(9); 
}
void print( int& x);  
void test11()  
{  
    Binary_tree<int> dd;  
    dd.insert(1);  
    dd.insert(2);  
    dd.insert(3);  
   
 dd.insert(4);  
    dd.insert(5);  
    dd.insert(6);  
    dd.insert(7);
   /***************  
Binary_tree<int> ww;  
    ww = dd;  
    ww.insert(10);  
     ww.insert(7);  
     cout<<"preorder:";  
    dd.preorder(print);  
     cout<<endl;  
    cout<<"preorder:";  
    ww.preorder(print);  
     cout<<endl; 
     dd.lay(9);  
    cout<<endl; 
    dd.reverse();  
    cout<<"preorder:";  
    ***************/
     dd.preorder(print);  cout<<endl; 
     dd.lay(9);  
    //dd.leaf();
dd.fun(4);
    cout<<endl;    
}  
void print( int& x)  
{  
    cout<<x<<" ";  
} 
 
 
int main()
{
//pintu();
test11();
    return 0;  
}  

/////////// /****************
   
//cout<<b->left->data<<"left"<<endl;
//if(b->left==NULL&&b->right==NULL){cout<<"#"<<endl;q.pop();}
             //  else {cout<<b->data<<" "<<endl;q.pop();}
 //if(b->left->data!=2&&b->left->data!=3){cout<<"#"<<endl;q.pop();}
     //           else {cout<<b->data<<" "<<endl;q.pop();}

时间: 2024-10-28 20:39:41

小代码 二叉树 添加树状打印及倒立打印的相关文章

Java文件目录树状结构:控制台打印某个文件夹下的文件目录树状结构

1 package com.zhen.file; 2 3 import java.io.File; 4 5 /* 6 * 控制台打印某个文件夹下的文件目录树状结构 7 * 递归算法 8 */ 9 10 public class FileTree { 11 12 public static void main(String[] args) { 13 File file =new File("D:/Github/JavaTest"); 14 PrintFile(file, 0); 15 }

小代码 二叉树之最大子树 和子树判断

 #include <iostream> using namespace std;  typedef struct node {     int x;     node*lc;     node*rc;     node(){}      node(int xx){x=xx;lc=NULL;rc=NULL;} }*BiTree; //int ss[]={1,2,3,0,0,4,0,0,5,6,0,0,7,0,0};int si=0; //int ss[]={1,2,-3,0,0,-4,0,0,

神奇的Grails:自关联的树状Domain一行代码获取所有子节点

见证Groovy/Grails的神奇时刻到了,你相信吗?用一行代码就可以获取树状结构中某节点下的所有全部子节点!注意:这个树是无深度限制的.无深度限制这点很重要,如果有限深度的树,那我们也很容易通过层级编码用“Like 001%”方式实现(维护编码也是一个有挑战性活).我们以一个非常常见的“类别”Domain为例,大类分小类,小类再细分,典型的树形结构,看看Grails是如何以简洁的语法表达的,体验Groovy语法的神奇! class Group{ String name static hasM

POJ3928 Pingpong(统计比 K 小的个数 + 树状数组)

Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2691   Accepted: 996 Description N(3<=N<=20000) ping pong players live along a west-east street(consider the street as a line segment). Each player has a unique skill rank. To im

【ExtJs】利用树状结构、Border布局与标签页刻划OA界面

之前说ExtJs是最适合做OA界面的前端框架,因为它把客户端界面搬来了网页,这东西可以说是,就是为那些各种各样的OA信息系统而生的. 一.基本目标 做出如下的OA界面,点击左边的项可以打开相应的标签页,点击标签页的关闭按钮可以关闭这个标签页,在下方的操作信息栏记录相应的操作. 树状结构可以折叠,可以调整.操作信息可以节点. 搞出这样的结构,就是从小的方面研究ExtJs的其它UI组件与Ajax系统,再配合php,aspx或者jsp等后端语言,就可以去OA系统开黑了,或者,一个不爽,标签页里面的系统

系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构

系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这个实体有关联关系. 3,每个实体中都有什么属性? 1,主键.推荐使用代理主键 2,关联关系属性.在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性.有几个端指向本类,本类中就有几个关联关系属性. 3,一般属性.分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等.

树状数组求逆序对:POJ 2299、3067

前几天开始看树状数组了,然后开始找题来刷. 首先是 POJ 2299 Ultra-QuickSort: http://poj.org/problem?id=2299 这题是指给你一个无序序列,只能交换相邻的两数使它有序,要你求出交换的次数.实质上就是求逆序对,网上有很多人说它的原理是冒泡排序,可以用归并排序来求出,但我一时间想不出它是如何和归并排序搭上边的(当初排序没学好啊~),只好用刚学过的树状数组来解决了.在POJ 1990中学到了如何在实际中应用上树状数组,没错,就是用个特殊的数组来记录即

bzoj 4871: [Shoi2017]摧毁“树状图”

4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec  Memory Limit: 512 MBSubmit: 53  Solved: 9[Submit][Status][Discuss] Description 自从上次神刀手帮助蚯蚓国增添了上千万人口(蚯口?),蚯蚓国发展得越来越繁荣了!最近,他们在地下发现了 一些神奇的纸张,经过仔细研究,居然是D国X市的超级计算机设计图纸!这台计算机叫做‘树状图’,由n个计算 节点与n1条可以双向通信的网线连接而成,所有计算

[bzoj3378][Usaco2004 Open]MooFest 狂欢节_树状数组

MooFest 狂欢节 bzoj-3378 Usaco-2004 Open 题目大意:给定一个n个数的a序列,每两个数之间有一个距离,两个点之间的权值为$max(a[i],a[j])*dis(i,j)$. 注释:$1\le n\le 2\cdot 10^4$. 想法:裙子说了,这种$max$和$min$的题通常要枚举这个$max$和$min$到底是多少. 这样的话我们就将所有点按权值从大到小排序. 往树状数组里插. 查询直接查询即可. 最后,附上丑陋的代码... ... #include <io