树形数据结构
// TreeDemo.cpp : 定義控制臺應用程序的入口點。
//
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;#include "stdafx.h"#define TYPE char//樹的節點
struct TreeNode{TYPE element;//該節點的元素TreeNode *firstChild;//指向該節點的第一個孩子TreeNode *nextSibling;//指向該節點的兄弟節點};class Tree{public:Tree(TreeNode * r = NULL):root(r){}Tree(int node_num);~Tree();void addNode(int i, int j); void preOrder();//前序遍歷void print();//打印private:void print(TreeNode* node, int num);void addBrotherNode(TreeNode* bro, TreeNode* node);void preOrder(TreeNode* parent);//前序遍歷private:TreeNode * root;//該樹的根
};//打印樹的形狀
void Tree::print()
{print(root, 0);
}void printSpace(int num)
{int i = 0;for(i = 0; i < num-3; i++)cout << " ";for(; i < num-2; ++i)cout << "|";for(; i < num; ++i)cout << "_";
}void Tree::print(TreeNode* node, int num)
{if(node != NULL){printSpace(num); cout << node->element << endl; print(node->firstChild, num+4);print(node->nextSibling, num);}
}//前序遍歷
void Tree::preOrder()
{cout << "前序遍歷: ";preOrder(root);cout << endl;
}void Tree::preOrder(TreeNode* parent)
{if(parent != NULL){cout << parent->element << " ";preOrder(parent->firstChild);preOrder(parent->nextSibling);}
}//分配并初始化所有的樹結點
Tree::Tree(int node_num)
{root = new TreeNode[node_num];char ch = 'A';for(int i = 0; i < node_num; ++i){root[i].element = ch + i;root[i].firstChild = NULL;root[i].nextSibling = NULL;}}//釋放所有節點的內存空間
Tree::~Tree()
{if(root != NULL)delete [] root;
}//addNode將父子結點組對
//如果父節點的firstChild==NULL, 則firstChild = node;
//如果父節點的firstChild != NULL, 則
void Tree::addNode(int i, int j)
{TreeNode* parent = &root[i];TreeNode* node = &root[j];if(parent->firstChild == NULL)parent->firstChild = node;elseaddBrotherNode(parent->firstChild, node);
}//將節點插入到兄弟節點
void Tree::addBrotherNode(TreeNode* bro, TreeNode* node)
{if(bro->nextSibling == NULL)bro->nextSibling = node;elseaddBrotherNode(bro->nextSibling, node);
}int _tmain(int argc, _TCHAR* argv[])
{Tree tree(16);//分配十六個節點tree.addNode(0, 1);tree.addNode(0, 2);tree.addNode(0, 3);tree.addNode(0, 4);tree.addNode(0, 5);tree.addNode(0, 6);
tree.addNode(3, 7);tree.addNode(4, 8);tree.addNode(4, 9);tree.addNode(5, 10);tree.addNode(5, 11);tree.addNode(5, 12);tree.addNode(6, 13);tree.addNode(9, 14);tree.addNode(9, 15);cout << "Tree1: " << endl;tree.preOrder();tree.print(); Tree tree2(9);tree2.addNode(0, 1);tree2.addNode(0, 2);tree2.addNode(1, 3);tree2.addNode(1, 4);tree2.addNode(2, 5);tree2.addNode(3, 6);tree2.addNode(5, 7);tree2.addNode(5, 8);cout << "Tree2: " << endl;tree2.preOrder();tree2.print();return 0;
}
樹在內存中:
一條條鏈條拼接起來的,而且一般是由根到葉單向尋找。
對于二叉樹我們節點可以這樣定義:
//樹的節點 struct Node{TYPE element;//該節點的元素Node *leftChild;//左子節點Node *rightChild;//右子節點};總結
- 上一篇: lol猪妹s11出装 瑟庄妮打野天赋
- 下一篇: 说说I/O与IPC