`

非递归遍历二叉树

阅读更多
#include<stdio.h>
#include<malloc.h>

typedef struct binode{
    char data;
    struct binode *lchild;
    struct binode *rchild;
}BiNode,*BiTree;
/****************************
 *输入创建二叉树: abd##ef###c##
 *其实输入按照先序顺序,#表示叶子节点
 *****************************/
void create(BiTree t){
    char ch=(char)getchar();
    if(ch=='#'){
        t->data='#';
        t->lchild=NULL;
        t->rchild=NULL;
    }
    else{
        t->data=ch;
        t->lchild=(BiTree)malloc(sizeof(BiNode));
        create(t->lchild);
        t->rchild=(BiTree)malloc(sizeof(BiNode));
        create(t->rchild);
    }  
}
//先序遍历
void preTraverse(BiTree t){
    BiTree p=t;
    BiTree stack[20]; //使用栈来替代递归方法
    int top=0;
    while(top>=0){
       while(p->data!='#'){
           printf("%c ",p->data);
           stack[top++]=p;
           p=p->lchild;
       }
       if(top>0)
          p=stack[--top]->rchild;
       else 
          top=-1;
       
    }
}
//中序遍历,和先序差不多
void midTraverse(BiTree t){
    BiTree p=t;
    BiTree stack[20];
    int top=0;
    while(top>=0){
        while(p->data!='#'){
           stack[top++]=p;
           p=p->lchild;
        }
        if(top>0){
           p=stack[--top];
           printf("%c ",p->data);
           p=p->rchild;
        }else
           top=-1;
    }
}
//后序遍历,稍微复杂一点
void afeTraverse(BiTree t){
    BiTree p=t,q=t;
    BiTree stack[20];
    int top=0;
    while(top>=0){
        while(p->data!='#'){
           stack[top++]=p;
           p=p->lchild;
        }
        if(q->rchild==p){
           printf("%c ",q->data);
           q->data='#'; //遍历完的节点直接做叶子标记
           --top; 
        }
        if(top>0){
           p=stack[top-1];
           q=p;
           p=p->rchild;
           
        }
    }
}
//测试
int main(){
    BiTree root=(BiTree)malloc(sizeof(BiNode));
    create(root);
    afeTraverse(root);
    printf("\n");
    return 1;
}

 

分享到:
评论
26 楼 piao_bo_yi 2010-07-16  
其实这种题本质上->矩阵思想+等差数列。
首先,数多少行->6行。OK。
         @author pby
 for(int i=1; i<=6; i++)/*外层框架出来了*/
	{
		//...
		System.out.println();
	}


观察,发现每行前面是空格,数量{1:5, 2:4, 3:3...},等差数列,得出->An=6-N;
	for(int i=1; i<=6; i++)/*外层框架出来了*/
	{
		for(int j=1; j<=6-i; j++)/*前面空格解决了*/
            	{
                		 System.out.print(" ");
            	}
		//...
		System.out.println();
	}

然后,发现前三行和后三行规律不一样,分开处理。上部分星也是等差数列{1:1, 2:3, 3:5},
得出->An=2*N-1,于是:
	for(int i=1; i<=6; i++)/*外层框架出来了*/
	{
		for(int j=1; j<=6-i; j++)/*前面空格解决了*/
            		{
                		System.out.print(" ");
            		}
		if (i <= 3) {
                		for(int j=1; j<=2*i-1; j++)
                		{                    
				System.out.print("*");
                		}
            		} else {
                		//...
                	}
		System.out.println();
	}

后面思路一样,最后代码:
public static void printStar()
    {
        for(int i=1; i<=6; i++)
        {
            for(int j=1; j<=6-i; j++)
            {
                System.out.print(" ");
            }
            if (i <= 3) {
                for(int j=1; j<=2*i-1; j++)
                {
                    System.out.print("*");
                }
            } else {
                int index = i-3;/*索引转换比较重要,这样会简化思路*/
                for(int j=1; j<=2*index-1; j++)
                {
                    System.out.print("*");
                }
                for(int j=1; j<=-2*index+7; j++)
                {
                    System.out.print(" ");
                }
                for(int j=1; j<=2*index-1; j++)
                {
                    System.out.print("*");
                }
            }
            System.out.println();
        }

  这样构思比较快而且这类题目都可以这么搞,最多10分钟就搞定了。感觉这种东西的难点就是总会有一种错觉让你觉得你可以直接在某个位置直接打印星号,而忽略前面的空格,诡异...然后这种思路导致你冲动回了这个十年前的东东...
25 楼 zealot2007 2010-07-16  
还是用python写容易,几行就搞定了
import sys

def printTriangle(m, num=1, offset=0):
    #num是一行打印的三角个数
    for i in range(m):
        print ' ' * offset + ' ' * (m - 1 - i) + (' ' * (2 * (m - 1 - i) )).join( [ '*' * (2 * i + 1) + ' ' for j in range(num)] )

def printStar(m, num):
    #num是层数
    for i in range(num):
        offset = (num - i - 1) * m
        printTriangle(m, i + 1, offset)

if __name__ == "__main__":
    if not len(sys.argv) == 3:
        print "Usage: python printStar.py 3 2"
    else:      
        printStar(int(sys.argv[1]), int(sys.argv[2]))
24 楼 peacenik 2010-04-26  
思路:分上下两部分 找到三角形中间列 判断条件输出
代码:
public static void print(Integer k) {
//		最大列数
		int m = 3 + 4 * (k - 1);
//		最中间一列
		int md = Math.round(m / 2);
//		两边中间
		int h = md / 2;
		for (int i = 0; i < 2 * k; i++) {
			System.out.print((i + 1) + "\t|");
			for (int j = 0; j < m; j++) {
				if (i < k) {
					System.out.print((j > md - (i + 1) && j < md + (i + 1)) ? "*": " ");
				} else {
					int y = j > md ? j - md - 1 : j;
					System.out.print((y > h - (i - k + 1) && y < h+ (i - k + 1)) ? "*" : " ");
				}
			}
			System.out.println();
		}
	}
23 楼 feiyangdesky 2009-11-04  
真服了,还有这样的兴趣,直接递归就可以
22 楼 numen_wlm 2009-11-04  
當年(貌似1998年?)玩Basic的時候,玩過N多這種類型的程序,什么圖形都玩。現在看到這種類型的程序都會吐...
21 楼 dieslrae 2009-11-03  
macadam 写道
treblesoftware 写道
Heart.X.Raid 写道
长见识了,上面两楼的兄弟果然厉害,在下佩服。不过不知道如果我想让100行的小三角形堆叠起来,对了最好堆叠100层。希望上面的兄弟能给我System.out.println();出来,而且还要求"结果正确","维护简单",更要求“灵活多变”。

真长见识了....


2楼的兄弟,递归是个好办法,同意你的观点,但是希望不要嘴上说说,写个程序帖出来,让大家学习学习。现在很多程序员解答别人的问题的时候都喜欢说上一句,然后闪了,希望大家能认识到程序员的工作是什么:写程序,不是说算法。



我高中考试高考QBASIC设计就是这样写的,满分。

PS:其实我从高一就已经这样写了。不过那个时候是:

print(*);
print(**);
print(***);
print(****);



不过面试的时候却是零分

不过面试是不会问这种没有实际意义的问题的
20 楼 Heart.X.Raid 2009-11-03  
牛叉  学习了
19 楼 fireflyc 2009-11-03  
坊间流传此代码效率非常高。来一个贴图
apache基准测试

ab -c1000 -n1000 http://localhost:3000

18 楼 fireflyc 2009-11-03  
好吧,居然这么多回复,我也来贴一个。
可爱图形之五角星web服务器版本——闪亮登场。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.URLDecoder;
import java.net.URLEncoder;

import org.apache.asyncweb.common.DefaultHttpResponse;
import org.apache.asyncweb.common.HttpCodecFactory;
import org.apache.asyncweb.common.HttpHeaderConstants;
import org.apache.asyncweb.common.HttpRequest;
import org.apache.asyncweb.common.MutableHttpRequest;
import org.apache.asyncweb.common.MutableHttpResponse;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoBuffer;
import org.apache.mina.common.IoFutureListener;
import org.apache.mina.common.IoHandler;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.WriteFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class Server {

	public void start() throws IOException {
		SocketAcceptor acceptor = new NioSocketAcceptor();
		acceptor.getFilterChain().addLast("codec",
				new ProtocolCodecFilter(new HttpCodecFactory()));

		acceptor.setReuseAddress(true);
		acceptor.getSessionConfig().setReuseAddress(true);
		acceptor.getSessionConfig().setReceiveBufferSize(1024 * 100);
		acceptor.getSessionConfig().setSendBufferSize(1024 * 100);
		acceptor.getSessionConfig().setTcpNoDelay(true);
		acceptor.getSessionConfig().setSoLinger(-1);
		acceptor.setBacklog(50000);
		acceptor.setHandler(new IoHandler() {
			@Override
			public void exceptionCaught(IoSession session, Throwable throwable)
					throws Exception {
			}

			@Override
			public void messageReceived(IoSession session, Object message)
					throws Exception {
				MutableHttpRequest request = (MutableHttpRequest) message;
				MutableHttpResponse response = new DefaultHttpResponse();

				response.setContent(IoBuffer.wrap(readPicuter().getBytes()));

				writeResponse(session, request, response);
			}

			@Override
			public void messageSent(IoSession arg0, Object message)
					throws Exception {
			}

			@Override
			public void sessionClosed(IoSession session) throws Exception {
			}

			@Override
			public void sessionCreated(IoSession session) throws Exception {
			}

			@Override
			public void sessionIdle(IoSession session, IdleStatus status)
					throws Exception {
			}

			@Override
			public void sessionOpened(IoSession session) throws Exception {
			}

			public void writeResponse(IoSession session, HttpRequest req,
					MutableHttpResponse res) {
				res.normalize(req);
				WriteFuture future = session.write(res);
				if ((session.getAttribute("file") == null)
						&& !HttpHeaderConstants.VALUE_KEEP_ALIVE
								.equalsIgnoreCase(res
										.getHeader(HttpHeaderConstants.KEY_CONNECTION)))
					future.addListener(IoFutureListener.CLOSE);
			}
		});

		acceptor.bind(new InetSocketAddress(3000));
	}

	private String readPicuter() throws IOException {
		InputStream is = Server.class.getResourceAsStream("/picuter.txt");
		StringWriter result = new StringWriter();
		PrintWriter out = new PrintWriter(result);
		BufferedReader reader = new BufferedReader(new InputStreamReader(is,
				"utf-8"));
		String line = null;
		while ((line = reader.readLine()) != null) {
			out.println(line);
		}
		is.close();
		return result.toString();
	}

	public static void main(String args[]) throws IOException {
		new Server().start();
	}
}


这个是文件
                                  *
                                 ***
                               *****
                             *      *
                           ***      ***
                         *****     *****


本来打算做成telnet的,后来考虑到web那么普及而且不用客户端,所以就来了这个。

启动程序,访问http:locahost:3000即可看到效果。

鼓掌。。。。。
17 楼 Heart.X.Raid 2009-11-03  
seele 写道
有必要这样吗?


把你打的三角行当作一个点。。就可以了。。。有中心。。

LS的你的。。。效率很差



你好,我是LZ,我算法的效率是不高,用了近四层循环。不过我说的我还是不太明白,能否写一个程序出来让我看看。谢谢
16 楼 seele 2009-11-02  
有必要这样吗?


把你打的三角行当作一个点。。就可以了。。。有中心。。

LS的你的。。。效率很差
15 楼 zhang_jie439 2009-11-02  
分步骤解决:
第一步 :
public class StartTree {

	public static void main(String[] args) {
		show(5);
	}
	
	public static void show(int n){
		for(int j=1;j<=n;j++){
			for(int i=1;i<=j;i++){
				System.out.print("*");
				System.out.print(" ");
			}
			System.out.println();
		}
	}

}

效果:
*
* *
* * *
* * * *
* * * * *
第二步:
public class StartTree {

	public static void main(String[] args) {
		show(5,3);
	}
	
	public static void show(int n,int m){
		for(int j=1;j<=n;j++){
			for(int i=1;i<=j;i++){
				for(int k=1;k<=2*m-1;k++)System.out.print("*");
				System.out.print(" ");
			}
			System.out.println();
		}
	}

}

效果:
*****
***** *****
***** ***** *****
***** ***** ***** *****
***** ***** ***** ***** *****
第三步:
public class StartTree {

	public static void main(String[] args) {
		show(5,3);
	}
	
	public static void show(int n,int m){
		for(int j=1;j<=n;j++){
			for(int i=1;i<=m*(n-j);i++){
				System.out.print(" ");
			}
			for(int i=1;i<=j;i++){
				for(int k=1;k<=2*m-1;k++){
					System.out.print("*");
				}
				System.out.print(" ");
			}
			System.out.println();
		}
	}

}

效果:
            *****
         ***** *****
      ***** ***** *****
   ***** ***** ***** *****
***** ***** ***** ***** *****
第四步
public class StartTree {

	public static void main(String[] args) {
		show(5,3);
	}
	
	public static void show(int n,int m){
		for(int j=1;j<=n;j++){
			for(int h=1;h<=m;h++){
				for(int i=1;i<=m*(n-j);i++){
					System.out.print(" ");
				}
				for(int i=1;i<=j;i++){
					for(int k=1;k<=2*m-1;k++){
						System.out.print("*");
					}
					System.out.print(" ");
				}
				System.out.println();
			}
		}
	}

}

效果:
            *****
            *****
            *****
         ***** *****
         ***** *****
         ***** *****
      ***** ***** *****
      ***** ***** *****
      ***** ***** *****
   ***** ***** ***** *****
   ***** ***** ***** *****
   ***** ***** ***** *****
***** ***** ***** ***** *****
***** ***** ***** ***** *****
***** ***** ***** ***** *****
第五步:
public class StartTree {

	public static void main(String[] args) {
		show(5,3);
	}
	
	public static void show(int n,int m){
		for(int j=1;j<=n;j++){
			for(int h=1;h<=m;h++){
				for(int i=1;i<=m*(n-j);i++)	System.out.print(" ");
				for(int i=1;i<=j;i++){
					for(int k=1;k<=m-h;k++)System.out.print(" ");
					for(int k=1;k<=2*h-1;k++)System.out.print("*");
					for(int k=1;k<=m-h;k++)System.out.print(" ");
					System.out.print(" ");
				}
				System.out.println();
			}
		}
	}

}

效果:
                *  
             *** 
            *****
           *     *  
          ***   *** 
         ***** *****
        *     *     *  
       ***   ***   *** 
      ***** ***** *****
     *     *     *     *  
    ***   ***   ***   *** 
   ***** ***** ***** *****
  *     *     *     *     *  
***   ***   ***   ***   *** 
***** ***** ***** ***** *****


show(5,5);的效果图


14 楼 iaimstar 2009-11-02  
treblesoftware 写道

我高中考试高考QBASIC设计就是这样写的,满分。

PS:其实我从高一就已经这样写了。不过那个时候是:

print(*);
print(**);
print(***);
print(****);



握手 ,我初中学qb也是这个程序,后来奥赛突然变成寻路了,茶几了
13 楼 akfucc 2009-11-02  
public class Star {
	public static void main(String[] args) {
		// 打印四星, 共四层
		int total = 4, starNum = 4;
		StringBuffer buf = new StringBuffer();
		for (int i = 1; i <= total; i++) {
			buf.append(layer(total, i, starNum));
		}
		System.out.println(buf);
	}

	/**
	 * @param totalLayer
	 *            总共几层
	 * @param layer
	 *            第几层
	 * @param starNum
	 *            一层有几星
	 * @return
	 */
	public static String layer(int totalLayer, int layer, int starNum) {
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < starNum; i++) {// 共starNum行
			// 每一行由layer*2个部分组成
			buf.append(blanks((totalLayer - layer) * starNum));
			for (int j = 0; j < layer * 2; j++) {
				if (j == 0) {
					buf.append(blanks(starNum - i - 1));
				} else if (j % 2 == 0) {
					buf.append(blanks(starNum * 2 - i * 2 - 1));
				} else {
					buf.append(stars(i * 2 + 1));
				}
			}
			buf.append('\n');
		}
		return buf.toString();
	}

	static String	BLANKS	= "                    ";
	static String	STARS	= "********************";

	public static String blanks(int num) {
		return BLANKS.substring(0, num);
	}

	public static String stars(int num) {
		return STARS.substring(0, num);
	}
}

12 楼 d-jasonlee 2009-11-02  
public class Test2 {
	public static void main(String[] args) throws Exception {
		int n = 4;
		// 上层
		for (int i = 1; i <= n; i++) {
			// 打印' '
			for (int j = 1; j <= (n*2)-i; j++) {
				System.out.print(" ");
			}
			// 打印'*'
			for (int j = 1; j <= i * 2 - 1; j++) {
				System.out.print("*");
			}
			// 换行
			System.out.println("");
		}
		
		// 下层
		for(int i = 1; i <= n; i++){
			// 左侧
			// 打印' '
			for(int j = 1; j<= n-i; j++){
				System.out.print(" ");
			}
			// 打印'*'
			for (int j = 1; j <= i * 2 - 1; j++) {
				System.out.print("*");
			}
			// 右侧
			// 打印' '
			for(int j = 1; j<= (n-i)*2+1; j++){
				System.out.print(" ");
			}
			// 打印'*'
			for (int j = 1; j <= i * 2 - 1; j++) {
				System.out.print("*");
			}
			// 换行
			System.out.println("");
		}
	}
}
11 楼 Heart.X.Raid 2009-11-02  
我也觉得挺乐的,不过如果不理你的话就太每礼貌了,毕竟你们还是很捧我的场。

高一就写程序了,后生可畏呀。我写程序的时候都大一了,嗨....

时代出人才呀..
10 楼 prowl 2009-11-02  
楼主没点幽默细胞 - -!
9 楼 macadam 2009-11-02  
treblesoftware 写道
Heart.X.Raid 写道
长见识了,上面两楼的兄弟果然厉害,在下佩服。不过不知道如果我想让100行的小三角形堆叠起来,对了最好堆叠100层。希望上面的兄弟能给我System.out.println();出来,而且还要求"结果正确","维护简单",更要求“灵活多变”。

真长见识了....


2楼的兄弟,递归是个好办法,同意你的观点,但是希望不要嘴上说说,写个程序帖出来,让大家学习学习。现在很多程序员解答别人的问题的时候都喜欢说上一句,然后闪了,希望大家能认识到程序员的工作是什么:写程序,不是说算法。



我高中考试高考QBASIC设计就是这样写的,满分。

PS:其实我从高一就已经这样写了。不过那个时候是:

print(*);
print(**);
print(***);
print(****);



不过面试的时候却是零分
8 楼 treblesoftware 2009-11-02  
Heart.X.Raid 写道
长见识了,上面两楼的兄弟果然厉害,在下佩服。不过不知道如果我想让100行的小三角形堆叠起来,对了最好堆叠100层。希望上面的兄弟能给我System.out.println();出来,而且还要求"结果正确","维护简单",更要求“灵活多变”。

真长见识了....


2楼的兄弟,递归是个好办法,同意你的观点,但是希望不要嘴上说说,写个程序帖出来,让大家学习学习。现在很多程序员解答别人的问题的时候都喜欢说上一句,然后闪了,希望大家能认识到程序员的工作是什么:写程序,不是说算法。



我高中考试高考QBASIC设计就是这样写的,满分。

PS:其实我从高一就已经这样写了。不过那个时候是:

print(*);
print(**);
print(***);
print(****);


7 楼 liliuw 2009-11-02  
我又重写代码,这次可以控制层数
public class StarGraphs {
public void mergeGraph(int size,int c){

        int line=size; //小三角形的行数 
        int chen=c;//小三角形的层数 
        for(int t=0;t<chen;t++){//控制小三角形的层数
        for(int i=0;i<line;i++){//控制小三角形的行数
    for(int g=0;g<size*(chen-t-1);g++){
    System.out.print(" ");
    }
    for(int k=0;k<t+1;k++){//打印小三角形
    for(int j=0;j<size*2-1;j++){
    if(j>=(size*2-1)/2-i&&j<=(size*2-1)/2+i){  
    System.out.print("*"); 
    }else{
    System.out.print(" ");
                }
   
    }
    System.out.print(" ");
    }
    System.out.println();
    }
        }
}
public static void main(String[] args) {
StarGraphs g=new StarGraphs();
g.mergeGraph(4,3);//4为传入小三角形的行数 ,2为小三角形排列的层数
}

}

相关推荐

Global site tag (gtag.js) - Google Analytics