本周学习了树和二叉树这一结构,对于以前的结构来讲,我以为难了不少,首先这个结构有孩子结点,兄弟结点,双亲结点等, 首先从建立树的结构来讲就复杂了不少,在对树的不少操做中用到了不少递归的算法,这对于原本以前递归算法就不太理解的我来讲挺难的,并且一旦程序写错了,递归算法很不容易发现错误,因此在写树的相关程序的时候,最重要的我以为仍是整个思路的问题,有些递归算法不太容易想出来,而一旦想出来问题就变得简单不少了。ios
二叉树有先序,中序,后序遍历等遍历树的方法,其中还有相关的转换,这个问题感受很难,理解三种的转化还挺容易,可是代码的实现特别难写...感受要看好多好多遍才能记住...总结就是这章的知识点挺多的c++
void InitExpTree(BTree &T,string str) //建表达式的二叉树 { 定义一个栈s存放数字 定义一个栈op 存放运算符 ‘#’进op栈; while遍历str 给树结点赋值 { If str[i]为数字 { 新建树结点T=new BiTNode; T->data=str[i++];T的左右孩子都置为空 T入s栈; } else是运算符 { switch调用precede函数比较op栈顶和str[i] { case'<':str[i++]入栈op case'=':op栈出栈 case'>': 新建结点T,T->data=op.top() T->rchild=s.top();s栈出栈 T->lchild=s.top();s栈出栈 新建的T结点入s栈 op栈出栈 } } while(op栈顶元素不是'#') //把树结点的关系连起来 { 新建结点T; T->data=op.top();op栈出栈 T->rchild=s.top(); s栈出栈 T->lchild=s.top();s栈出栈 T结点进s栈 } } double EvaluateExTree(BTree T)计算表达式树 { 定义a,b if 树T不空 if 左右孩子都为空 return T->data-'0'; a=EvaluateExTree(T->lchild) b=EvaluateExTree(T->rchild) switch T->data case'+':return a+b case'-':rerurn a-b case'*':return a*b case '/': if b==0 输出divide 0 error! else return a/b }
#include<iostream> #include<stdio.h> #include<string> using namespace std; 定义字符型数组 str1[110],str2[110]; int main() { int n; 输入结点个数n; 输出str1 str2; 输出二叉树高度 return 0; } int dfs(char a[],char b[],int m) { if m==0 return 0;//没有节点,为空树 end if int i; for i=0 to i<m { if b[i]==a[0] //找到根节点在中序的位置 break; } end for int c=dfs(a+1,b,i)+1;//左子树的深度 int d=dfs(a+i+1,b+i+1,m-i-1)+1;//右子树的深度 int h; if c>d h=c++; else h=d++; return h; }
main函数和建树函数CreatTree(string str, int &i) void LevelOrder(BinTree BT) //层次遍历 { 定义BinTree型队列qt; int level,flag; 定义BinTree结构体curNode,lastNode; curNode=lastNode=BT; if BT==NULL 输出NULL return ; else BT进队 while(队qt不为空) { if curNode==lastNode { level++; 用flag控制换行 lastNode=qt.back(); } end if curNode=qt.front(); 输出curNode->Data if curNode->Left不为空 curNode->Left进队qt if curNode->Right非空 curNode->Right进队qt qt队出队 } }
给定一棵二叉树,返回全部重复的子树。对于同一类的重复子树,你只须要返回其中任意一棵的根结点便可。
两棵树重复是指它们具备相同的结构以及相同的结点值
下面是两个重复的子树:
算法
经过map记录每颗子树先序遍历或者后序遍历的结果, 找到全部遍历结果相同的子树。数组