主题:[原创]二叉树的层次遍历。。。急!!
			 wpsb
				 [专家分:0]  发布于 2008-08-16 09:15:00
 wpsb
				 [专家分:0]  发布于 2008-08-16 09:15:00							
			
哪位高手能解释一下,最好能给出代码
						
					 
		
			
回复列表 (共6个回复)
		
								
				沙发
				
					 炫光之殇 [专家分:100]  发布于 2008-08-16 17:14:00
炫光之殇 [专家分:100]  发布于 2008-08-16 17:14:00				
				前序,中序,后序
都是先左后右,前中后的区别是访问根结点的顺序。
前:先访问根结点,其次访问左子树,最后访问右子树。
中:先访问左子树,其次访问根结点,最后访问右子树。
后:先访问左子树,其次访问右子树,最后访问根结点。
代码:
procedure bianli(p);
begin
  if p.left<>null then bianli(p.left);
  visit(p.num);
  if p.right<>null then bianli(p.right);
end;
这个是前序遍历,其他两个遍历同理可得。
过程的参数是一个节点类型,visit指的是访问这个节点的数据。
还有什么看不明白的再说吧。
							 
						
				板凳
				
					 abcwuhang [专家分:1840]  发布于 2008-08-26 10:26:00
abcwuhang [专家分:1840]  发布于 2008-08-26 10:26:00				
				procedure pro(p:link);
begin
  if p^.left<>nil then pro(p^.left);
  writeln(p^.data);
  if p^.right<>nil then pro(p^.right);
end;
							 
						
				3 楼
				
					 1042144576 [专家分:10]  发布于 2009-09-26 14:27:00
1042144576 [专家分:10]  发布于 2009-09-26 14:27:00				
				宽搜一下就行了
							 
						
				4 楼
				
					 abcwuhang [专家分:1840]  发布于 2009-11-01 13:58:00
abcwuhang [专家分:1840]  发布于 2009-11-01 13:58:00				
				注意是层次遍历啊啊啊啊~~~
{层序遍历
使用一个先进先出的循环队列作为辅助手段
}
PROCEDURE LevelWays(t : Btree);
    var
        p : Btree;  {p表示当前结点}
        queue : array [0..MAX] of Btree; {循环队列queue[]用来存储结点}
        front, rear : integer;
    begin
        front := -1;
        rear := -1;
        if t <> nil then {先判断是否为空树}
        begin
            rear := 0;
            queue[rear] := t; {入队}
        end; {if}
        while front <> rear do {队列非空}
        begin
            front := (front + 1) mod MAX;{出队列,并输出结点}
            p := queue[front];
            write(p^.data:WIDTH);
            if p^.lc <> nil then {左孩子非空则入列}
            begin
                rear := (rear + 1) mod MAX;
                queue[rear] := p^.lc;
            end; {if}
            if p^.rc <> nil then {右孩子非空则入列}
            begin
                rear := (rear + 1) mod MAX;
                queue[rear] := p^.rc;
            end; {if}
        end; {while}
    end; {LevelWays}
{层序遍历:可以输出层号
使用循环队列记录结点的层次,设levelUp为上次打印结点层号,level为本层打印结点层号
}
PROCEDURE LevelPrint(t : Btree);
    type
        levelNode = record
                        level : integer;
                        pointer : Btree;
                    end;
    var
        p : Btree;  {p表示当前结点}
        queue : array [0..MAX] of levelNode; {循环队列queue[]用来存储levelNode结点}
        front, rear, levelUp, level : integer;
    begin
        front := -1;
        rear := -1;
        levelUp := 0;
        if t <> nil then {先判断是否为空树}
        begin
            rear := 0;
            queue[rear].level := 1; {结点层号入队}
            queue[rear].pointer := t; {结点内容入队}
        end; {if}
        while front <> rear do {队列非空}
        begin
            front := (front + 1) mod MAX;{出队列,并输出结点}
            level := queue[front].level; {记录当前结点的层号}
            p := queue[front].pointer; {记录当前结点的内容}
            if level = levelUp then {和上次输出的结点在同一层,只输出结点}
                write(p^.data:WIDTH)
            else {和上次输出的结点不在同一层,换行后输出结点并修改levelUp的值}
            begin
                writeln;
                write(p^.data:WIDTH);
                levelUp := level;
            end; {else}
            if p^.lc <> nil then {左孩子非空则入列}
            begin
                rear := (rear + 1) mod MAX;
                queue[rear].level := level + 1; {左孩子层号入列}
                queue[rear].pointer := p^.lc;  {左孩子结点入列}
            end; {if}
            if p^.rc <> nil then {右孩子非空则入列}
            begin
                rear := (rear + 1) mod MAX;
                queue[rear].level := level + 1; {右孩子层号入列}
                queue[rear].pointer := p^.rc;  {右孩子结点入列}
            end; {if}
        end; {while}
    end; {LevelPrint}
							 
						
				5 楼
				
					 zzj12345 [专家分:160]  发布于 2010-08-20 20:59:00
zzj12345 [专家分:160]  发布于 2010-08-20 20:59:00				
				我们正好今天学二叉树
谢谢了哦
							 
						
				6 楼
				
					 sgbhdd [专家分:0]  发布于 2011-05-09 09:25:00
sgbhdd [专家分:0]  发布于 2011-05-09 09:25:00				
				
[em4]谢了·
							 
									
			
我来回复