二叉树的中序遍历,以及与双向链表之间的转换
2018-03-07 21:19
405 查看
下面以一棵二叉查找树为例说明中序遍历的程序实现及其转化为双向链表的方法。二叉查找树的性质是:每个结点对应的值都大于其左子树中任意结点的值且小于右子树中任意结点的值,如下例所示。
可以明显地看出,该二叉树经历中序遍历后,值会从小到大输出,即4→6→8→10→12→14→16,我们最终要实现的目标是将这个二叉树转化为双向链表,即4⇆6⇆8⇆10⇆12⇆14⇆16。
首先定义一个结构体BinTree,它有三个成员,一个成员val存放结点的值,两个指针分别指向左子树和右子树。struct BinTree {
int val;
BinTree *left, *right;
BinTree(int v) : val(v), left(NULL), right(NULL) {}
};使用递归法来遍历二叉树是非常简洁明了的,这个无需多言。void traverse(BinTree *root)
{
if(root == NULL) return;
traverse(root->left);
cout << root->val << endl;
traverse(root->right);
}下面使用循环的方式来实现中序遍历,这会用到“栈”,不断将前面的结点压入栈中,代码如下。void treeTraverse(BinTree *root)
{
stack<BinTree*> s;
BinTree *p = root;
while (p || !s.empty()) {
while (p) {
s.push(p);
p = p->left;
}
p = s.top();
s.pop();
cout << p->val << endl;
p = p->right;
}
}可以看到,中序遍历时,cout的先后顺序正是双向链表从左到右的顺序,故只需将cout部分替换为指针指向代码即可,具体实现如下。BinTree* treeToList(BinTree *root)
{
stack<BinTree*> s;
BinTree *p = root, *prev = NULL, *head = NULL;
while (p || !s.empty()) {
while (p) {
s.push(p);
p = p->left;
}
p = s.top();
s.pop();
if(head == NULL) head = p;
if (prev) prev->right = p;
p->left = prev;
prev = p;
p = p->right;
}
return head;
}
9d5a
可以明显地看出,该二叉树经历中序遍历后,值会从小到大输出,即4→6→8→10→12→14→16,我们最终要实现的目标是将这个二叉树转化为双向链表,即4⇆6⇆8⇆10⇆12⇆14⇆16。
首先定义一个结构体BinTree,它有三个成员,一个成员val存放结点的值,两个指针分别指向左子树和右子树。struct BinTree {
int val;
BinTree *left, *right;
BinTree(int v) : val(v), left(NULL), right(NULL) {}
};使用递归法来遍历二叉树是非常简洁明了的,这个无需多言。void traverse(BinTree *root)
{
if(root == NULL) return;
traverse(root->left);
cout << root->val << endl;
traverse(root->right);
}下面使用循环的方式来实现中序遍历,这会用到“栈”,不断将前面的结点压入栈中,代码如下。void treeTraverse(BinTree *root)
{
stack<BinTree*> s;
BinTree *p = root;
while (p || !s.empty()) {
while (p) {
s.push(p);
p = p->left;
}
p = s.top();
s.pop();
cout << p->val << endl;
p = p->right;
}
}可以看到,中序遍历时,cout的先后顺序正是双向链表从左到右的顺序,故只需将cout部分替换为指针指向代码即可,具体实现如下。BinTree* treeToList(BinTree *root)
{
stack<BinTree*> s;
BinTree *p = root, *prev = NULL, *head = NULL;
while (p || !s.empty()) {
while (p) {
s.push(p);
p = p->left;
}
p = s.top();
s.pop();
if(head == NULL) head = p;
if (prev) prev->right = p;
p->left = prev;
prev = p;
p = p->right;
}
return head;
}
9d5a
相关文章推荐
- 二叉树的前序遍历,中序遍历,后序遍历以及相互之间的求法
- 二叉树的前 中 后序遍历,递归和非递归实现以及转换成双向链表
- VC中CDC与HDC的区别以及二者之间的转换
- java获取获得Timestamp类型的当前系统时间。以及java.util.date 、java.sql.Date之间的转换
- 【经典数据结构算法】(1)二叉查找树与双向链表之间的转换
- 树、森林和二叉树之间的转换
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
- Android 图片压缩的一些小技巧,以及bitmap和byte[]之间的转换
- VC中CDC与HDC的区别以及二者之间的转换
- 数据结构-----二叉树,树,森林之间的转换
- 中序线索化二叉树以及中序遍历线索化二叉树、倒中序遍历线索化二叉树
- VC中CDC与HDC的区别以及二者之间的转换
- 区位码,国标码,内码之间的区别与联系,以及如何转换
- 【慢慢学Android】:1.Activity之间的转换以及数据的传递(Intent)
- java enum的使用以及字符串其字符串之间的转换
- 14.二叉树 中序遍历 先序遍历 的非递归实现 以及 二叉树 的复制 及判断二叉树的等价性
- android dp与px之间转换以及px与sp之间的转换
- 【数据结构基础篇】树和二叉树之间的转换
- 树、森林和二叉树之间的转换
- 测试整数类型:byte,short,int,long。以及进制之间的转换问题