论坛首页 综合技术论坛

非递归遍历二叉树

浏览 11288 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (6)
作者 正文
   发表时间:2009-11-03  
macadam 写道
treblesoftware 写道
Heart.X.Raid 写道
长见识了,上面两楼的兄弟果然厉害,在下佩服。不过不知道如果我想让100行的小三角形堆叠起来,对了最好堆叠100层。希望上面的兄弟能给我System.out.println();出来,而且还要求"结果正确","维护简单",更要求“灵活多变”。

真长见识了....


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



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

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

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



不过面试的时候却是零分

不过面试是不会问这种没有实际意义的问题的
0 请登录后投票
   发表时间:2009-11-04  
當年(貌似1998年?)玩Basic的時候,玩過N多這種類型的程序,什么圖形都玩。現在看到這種類型的程序都會吐...
0 请登录后投票
   发表时间:2009-11-04  
真服了,还有这样的兴趣,直接递归就可以
0 请登录后投票
   发表时间: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();
		}
	}
0 请登录后投票
   发表时间: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]))
0 请登录后投票
   发表时间:2010-07-16   最后修改: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分钟就搞定了。感觉这种东西的难点就是总会有一种错觉让你觉得你可以直接在某个位置直接打印星号,而忽略前面的空格,诡异...然后这种思路导致你冲动回了这个十年前的东东...
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics