2016/11/30
来源:互联网 发布:数据库安全管理办法 编辑:程序博客网 时间:2024/06/08 16:16
1631-5 黄加勉 <2016.11.30> 【连续第60天总结】
A.今日任务
1.二叉树的链表形式表达(65%)
2.二叉树的前中后序遍历(100%)
3.快速排序
B.具体内容
1.链表形式的二叉树好处在于可以任意的往父节点上添加子节点,不需要受到初始化数组事内存空间的限制
无论什么样的链表,基本的结构都是节点Node,因此需要定义一个Node的类
class Node
{
public:
Node();
Node* getNode(int index);//寻找二叉树中的某一节点
void preorderTraversal();//前序遍历
void inorderTraversal();//中序遍历
void postorderTraversal();//后序遍历
int m_iIndex; //索引
int m_iData; //数据
Node *m_pParent;//双亲节点/父节点指针
Node *m_pLchild;//左孩子树指针
Node *m_pRchild;//右孩子树指针
};
当初始化一颗树时,初始化根节点m_pRoot,添加节点就是把新的节点的父节点指针指向根节点,根节点的左或右孩子树指针指向新加入的节点:
void BinaryTree::addNode(int index, char direction, Node *parNode)
{
//判断二叉树中是否存在当前索引的节点
Node *tempNode = getNode(index);
if (tempNode == NULL)
return;
//建立新节点
Node *newNode = new Node();
newNode->m_iData = parNode->m_iData;
newNode->m_iIndex = parNode->m_iIndex;
if (direction == 'L')
{
tempNode->m_pLchild = newNode;
cout << "success!" << endl;
}
else if (direction == 'R')
{
tempNode->m_pRchild = newNode;
cout << "success!" << endl;
}
}
二叉树的遍历分为前序遍历、中序遍历和后序遍历,遍历顺序分别为“根左右”、”左根右“、”左右根”
因为遍历整颗树,所以可以把每个节点当做根节点用node类中的遍历函数递归遍历:
//前序遍历
void Node::preorderTraversal()
{
cout << "No." << m_iIndex << " " << m_iData << endl;
if (m_pLchild != NULL)
m_pLchild->preorderTraversal();
if (m_pRchild != NULL)
m_pRchild->preorderTraversal();
}
//中序遍历
void Node::inorderTraversal()
{
if (m_pLchild != NULL)
m_pLchild->inorderTraversal();
cout << "No." << m_iIndex << " " << m_iData << endl;
if (m_pRchild != NULL)
m_pRchild->inorderTraversal();
}
//后续遍历
void Node::postorderTraversal()
{
if (m_pLchild != NULL)
m_pLchild->postorderTraversal();
if (m_pRchild != NULL)
m_pRchild->postorderTraversal();
cout << "No." << m_iIndex << " " << m_iData << endl;
}
2.如果用当前的函数添加新节点,因为m_pRoot索引始终为零,所以最多插入三层的节点,所以我觉得插入更多节点时应该先遍历整棵树,找到节点后在插入元素,明天实现
3.快速排序(升序)的原理简单说就是安基数把数组划分为三个区间,左边小于基数,右边大于基数,再递归上述过程至子区间中有且仅有一个元素为止
因此需要一个函数获取区间划分后基数指针的函数getAdjustNumber()(想不到更好的名字了)
int getAdjustNumber(int arr[], int head, int tail)
{
int temp = arr[head];
int i = head, j = tail;
while (i != j)
{
//从尾搜索小于基数的元素
while (arr[j] > temp && j > i)
j--;
if (i < j)
{
arr[i] = arr[j];
//从头搜索大于基数的元素
while (arr[i] < temp && j > i)
i++;
if (i < j)
{
arr[j] = arr[i];
j--;
}
}
}
arr[i] = temp;
//返回基数指针
return i;
}
于是当排序是可以用她简化代码:
void quickSort(int arr[], int head, int tail)
{
int temp;
if (tail > head)
{
temp = getAdjustNumber(arr, head, tail);
quickSort(arr, head, temp - 1);
quickSort(arr, temp + 1, tail);
}
}
4.感觉要起好函数名还是要学好英语,不然会起出一些不知所云的函数名和变量名。。
C.明日任务
1.链表二叉树
2.堆排序
blog.csdn.net/voooooh_8
A.今日任务
1.二叉树的链表形式表达(65%)
2.二叉树的前中后序遍历(100%)
3.快速排序
B.具体内容
1.链表形式的二叉树好处在于可以任意的往父节点上添加子节点,不需要受到初始化数组事内存空间的限制
无论什么样的链表,基本的结构都是节点Node,因此需要定义一个Node的类
class Node
{
public:
Node();
Node* getNode(int index);//寻找二叉树中的某一节点
void preorderTraversal();//前序遍历
void inorderTraversal();//中序遍历
void postorderTraversal();//后序遍历
int m_iIndex; //索引
int m_iData; //数据
Node *m_pParent;//双亲节点/父节点指针
Node *m_pLchild;//左孩子树指针
Node *m_pRchild;//右孩子树指针
};
当初始化一颗树时,初始化根节点m_pRoot,添加节点就是把新的节点的父节点指针指向根节点,根节点的左或右孩子树指针指向新加入的节点:
void BinaryTree::addNode(int index, char direction, Node *parNode)
{
//判断二叉树中是否存在当前索引的节点
Node *tempNode = getNode(index);
if (tempNode == NULL)
return;
//建立新节点
Node *newNode = new Node();
newNode->m_iData = parNode->m_iData;
newNode->m_iIndex = parNode->m_iIndex;
if (direction == 'L')
{
tempNode->m_pLchild = newNode;
cout << "success!" << endl;
}
else if (direction == 'R')
{
tempNode->m_pRchild = newNode;
cout << "success!" << endl;
}
}
二叉树的遍历分为前序遍历、中序遍历和后序遍历,遍历顺序分别为“根左右”、”左根右“、”左右根”
因为遍历整颗树,所以可以把每个节点当做根节点用node类中的遍历函数递归遍历:
//前序遍历
void Node::preorderTraversal()
{
cout << "No." << m_iIndex << " " << m_iData << endl;
if (m_pLchild != NULL)
m_pLchild->preorderTraversal();
if (m_pRchild != NULL)
m_pRchild->preorderTraversal();
}
//中序遍历
void Node::inorderTraversal()
{
if (m_pLchild != NULL)
m_pLchild->inorderTraversal();
cout << "No." << m_iIndex << " " << m_iData << endl;
if (m_pRchild != NULL)
m_pRchild->inorderTraversal();
}
//后续遍历
void Node::postorderTraversal()
{
if (m_pLchild != NULL)
m_pLchild->postorderTraversal();
if (m_pRchild != NULL)
m_pRchild->postorderTraversal();
cout << "No." << m_iIndex << " " << m_iData << endl;
}
2.如果用当前的函数添加新节点,因为m_pRoot索引始终为零,所以最多插入三层的节点,所以我觉得插入更多节点时应该先遍历整棵树,找到节点后在插入元素,明天实现
3.快速排序(升序)的原理简单说就是安基数把数组划分为三个区间,左边小于基数,右边大于基数,再递归上述过程至子区间中有且仅有一个元素为止
因此需要一个函数获取区间划分后基数指针的函数getAdjustNumber()(想不到更好的名字了)
int getAdjustNumber(int arr[], int head, int tail)
{
int temp = arr[head];
int i = head, j = tail;
while (i != j)
{
//从尾搜索小于基数的元素
while (arr[j] > temp && j > i)
j--;
if (i < j)
{
arr[i] = arr[j];
//从头搜索大于基数的元素
while (arr[i] < temp && j > i)
i++;
if (i < j)
{
arr[j] = arr[i];
j--;
}
}
}
arr[i] = temp;
//返回基数指针
return i;
}
于是当排序是可以用她简化代码:
void quickSort(int arr[], int head, int tail)
{
int temp;
if (tail > head)
{
temp = getAdjustNumber(arr, head, tail);
quickSort(arr, head, temp - 1);
quickSort(arr, temp + 1, tail);
}
}
4.感觉要起好函数名还是要学好英语,不然会起出一些不知所云的函数名和变量名。。
C.明日任务
1.链表二叉树
2.堆排序
blog.csdn.net/voooooh_8
0 0
- 2016-11-30
- 题目<2016/11/30>
- 2016-11-30
- CVPR 2016-11-30
- 2016/11/30
- 2016/11/30学习工作总结
- 【投资日记】2016-11-30
- 2016-11-30:发布OrangeUI 1.65
- 2016年10月30日11:23:19
- 2016/11/30 14:59 一个失败人生的开始
- [2016/11/30]python数据类型之元组和集合
- python数据结构学习笔记-2016-11-30-01-堆
- C++第一天 2016-11-30 1-1.2
- 11-30
- 2016-11
- Android Java(2015-6-18 15:28、2016-1-30 21:18、2016-5-31 11:20)
- 2016年11月30日 angularJS input=file 绑定change事件
- 2016年11月30日 数据库mysql 8个小时自动断开
- EasyUI Tree 树
- Hadoop学习笔记(一)
- 四道Java基础题 你能对几道?
- 友盟推送集成的常见问题
- Android 版本检测、文件下载并更新
- 2016/11/30
- BZOJ 3940 AC自动机
- 【Python机器学习】梯度下降法(三) 优矿(uqer.io)
- 113. Path Sum II 这里要注意 引用 和 传值的区别,见注释
- 网络请求runloop
- Two Day(2)---运算符
- R语言实战笔记--第一章 R的安装配置及使用
- JAVA实现打印机打印字符串
- Gradle入门