zoukankan      html  css  js  c++  java
  • 按层次遍历二叉树

    编写按层次顺序(同一层自左至右)遍历二叉树的算法。


    #include "stdafx.h"
    #include<iostream>    
    #include<vector>  
    
    using namespace std;
    
    
    struct BiNOde
    {
    	int ele;
    	BiNOde* lnode;
    	BiNOde* rnode;
    };
    
    vector<vector<int>>aa;
    BiNOde*p;
    BiNOde*root;
    
    
    
    void findparent(BiNOde*node, BiNOde*parent)
    {
    	if (parent == NULL)
    		return;
    	if (parent->lnode == node || parent->rnode == node)
    	{
    		p = parent; 
    		return;
    	}
    	findparent(node, parent->lnode);
    	findparent(node, parent->rnode);
    }
    
    int depth_of_node(BiNOde*node)
    {
    	int k = 0;
    	if (node == root)
    		return 0;
    	BiNOde*n = node;
    	while (n != root)
    	{
    		findparent(n, root);
    		n = p;
    		k++;
    	}
    
    	return k;
    }
    
    void PreOrderTraverse(BiNOde*node)
    {
    	if (node == NULL)
    		return;
    	int d = depth_of_node(node);
    	if (d + 1 > aa.size())
    	{
    		vector<int>a;
    		a.push_back(node->ele);
    		aa.push_back(a);
    	}
    	else
    	{
    		vector<int>a=aa[d];
    		a.push_back(node->ele);
    		aa[d] = a;
    	}
    	if (node->lnode != NULL)
    		PreOrderTraverse(node->lnode);
    	if (node->rnode != NULL)
    		PreOrderTraverse(node->rnode);
    
    }
    
    BiNOde*create_tree()
    {
    	BiNOde * root = new BiNOde;
    	BiNOde*node1 = new BiNOde;
    	BiNOde*node2 = new BiNOde;
    	BiNOde*node3 = new BiNOde;
    	BiNOde*node4 = new BiNOde;
    	BiNOde*node5 = new BiNOde;
    	BiNOde*node6 = new BiNOde;
    	BiNOde*node7 = new BiNOde;
    	BiNOde*node8 = new BiNOde;
    	BiNOde*node9 = new BiNOde;
    	BiNOde*node10 = new BiNOde;
    	BiNOde*node11 = new BiNOde;
    	root->ele = 0;
    	node1->ele = 1;
    	node2->ele = 2;
    	node3->ele = 3;
    	node4->ele = 4;
    	node5->ele = 5;
    	node6->ele = 6;
    	node7->ele = 7;
    	node8->ele = 8;
    	node9->ele = 9;
    	node10->ele = 10;
    	node11->ele = 11;
    	root->lnode = node1;
    	root->rnode = node2;
    	node1->lnode = node3;
    	node1->rnode = node4;
    	node2->lnode = node7;
    	node2->rnode = node8;
    	node3->lnode = node5;
    	node3->rnode = node11;
    	node4->lnode = node10;
    	node4->rnode = NULL;
    	node5->lnode = node6;
    	node5->rnode = NULL;
    	node6->lnode = NULL;
    	node6->rnode = NULL;
    	node7->lnode = node9;
    	node7->rnode = NULL;
    	node8->lnode = NULL;
    	node8->rnode = NULL;
    	node9->lnode = NULL;
    	node9->rnode = NULL;
    	node10->lnode = NULL;
    	node10->rnode = NULL;
    	node11->lnode = NULL;
    	node11->rnode = NULL;
    	//BiNOde*node12 = new BiNOde;    
    	//node12->ele = 12;    
    	//node12->lnode = NULL;    
    	//node12->rnode = NULL;    
    	//node6->lnode = node11;    
    	
    	return root;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	root = create_tree();
    	PreOrderTraverse(root);
    
    	system("pause");
    	return 0;
    }
    

    先序遍历一遍tree,同一深度的节点访问的顺序虽然不是连续的,但是却满足从左到右的顺序,只需将同以深度的节点依次存到一个数组即可。


    在main函数的system("pause")这一句设置断点,将全局变量aa添加监视,运行到system这一句暂停的时候观察aa中存放的数据,结果正确。

    版权声明:

  • 相关阅读:
    Window 窗口类
    使用 Bolt 实现 GridView 表格控件
    lua的table库
    Windows编程总结之 DLL
    lua 打印 table 拷贝table
    使用 xlue 实现简单 listbox 控件
    使用 xlue 实现 tips
    extern “C”
    COleVariant如何转换为int double string cstring
    原来WIN32 API也有GetOpenFileName函数
  • 原文地址:https://www.cnblogs.com/walccott/p/4956899.html
Copyright © 2011-2022 走看看