对于大量的输入数据,链表的线性访问时间太慢,不宜使用。树是一种在实际编程中常常遇到的数据结构,其大部分操做的运行时间平均为O(logN)。树的逻辑结构十分简单: 除了根节点以外每一个节点只有一个父节点,根节点没有父节点:除了叶节点以外全部节点都有一个或多个子节点,父节点和子节点之间用指针连接。ios
面试时提到的树大部分都是二叉树。所谓二叉树是书的一种特殊结构。在二叉树中最重要的结构莫过于遍历,即按照某一顺序访问树中的全部节点,经常使用的遍历方式主要有三种:前序,中序,后序。这三种遍历都有递归和循环两种不一样的实现方法,每一种遍历的递归实现都比循环实现要简洁不少。面试
对于一颗普通的树,因为每一个节点的孩子个数能够变化很大而且实现不知道,所以在数据结构中创建到各孩子节点直接的链接时不可行的,由于这样会产生太多的浪费空间。(解决方案:将每一个节点的全部儿子都放在树节点的链表中。以下)算法
typedef struct TNode { ElemType data; struct TNode *firstChild; struct TNode *NextChild; }TreeNode, *BinaryTree;
二叉树:二叉树的一个性质是平均二叉树的深度要比N小得多。分析代表,这个平均深度为O(N^0.5),而对于特殊类型的二叉树,即二叉查找树,其平均深度为O(logN)。固然,在最坏的状况下它的深度能够达到N-1. 编程
二叉树的主要用处之一是在编译器的设计领域。例如:表达式树:表达式树的叶子是操做数,而其余的节点是操做符,例如:数据结构
如今给出一种算法来把后缀表达式转变成表达式树。spa
输入:a b + c d e + * *设计
思路:前两个符号是操做数,所以建立两棵单节点数并将指向它们的指针压入栈中,每当读入一个操做符时,将栈顶的两个树的指针出栈,造成一个新的树,并将这棵新的树的根节点指针入栈。直至结束。指针
//表达式树 #include<iostream> #include<stack> using namespace std; typedef char ElemType; typedef struct TNode { ElemType data; struct TNode *Lchild; struct TNode *Rchild; }TreeNode, *BinaryTree; TNode* ExpressionTree(char str[]) { stack<TNode*> s; //建立一个栈指向二叉树的节点 TNode *TreeNode; int i = 0; while(str[i] != '#') { if(str[i] >= 'a' && str[i] <= 'z') { TNode* childNode = new TNode(); childNode->data = str[i]; s.push(childNode); } else { TNode* treeNode = new TNode(); treeNode->data = str[i]; if(!s.empty()) { treeNode->Rchild = s.top(); s.pop(); } else return treeNode; if(!s.empty()) { treeNode->Lchild = s.top(); s.pop(); } else return treeNode; s.push(treeNode); } i++; } if(s.empty()) return NULL; else { TreeNode = s.top(); return TreeNode; } } void PostOrder(BinaryTree T) //后序遍历二叉树 { if(T == NULL) return; if(T->Lchild != NULL) { PostOrder(T->Lchild); } if(T->Rchild != NULL) { PostOrder(T->Rchild); } cout << T->data << " "; } void InOrder(BinaryTree T) //中序遍历二叉树 { if(T == NULL) return; if(T->Lchild != NULL) InOrder(T->Lchild); cout << T->data << " "; if(T->Rchild != NULL) InOrder(T->Rchild); } int main() { char ch[] = "ab+cde+**#"; TNode *T; T = ExpressionTree(ch); PostOrder(T); cout << endl; InOrder(T); system("pause"); return 0; }