雖然已經從事程式設計快4年了,但是由於不是科班出身,存在很多的弱點,尤其是最近的開發過程中,一旦遇到複雜點的對應關係就有氣無力的,有點時間就補一下基礎知識吧。
查詢二叉樹的實現和幾種遍歷方法 參考:資料結構與演算法分析c++描述
原始碼:二叉樹實現
#pragma once
#include #include using namespace std;
template class binarysearchtree
binarysearchtree(const binarysearchtree &rth)
:root(null) }
~binarysearchtree(void)
//查詢最小 遞迴
const comparable & findmin() const
return pnode->element;
} //查詢最小 非遞迴
const comparable & findmin2() const
return pnode->element;
} //查詢最大 遞迴
const comparable & findmax() const
return pnode->element;
} //查詢最大 非遞迴
const comparable & findmax2() const
return pnode->element;
} //查詢是否包含 遞迴
bool contains(const comparable &x) const
//查詢是否包含 非遞迴
bool contains2(const comparable &x) const
//判斷為空
bool isempty() const
else
}//遍歷 先序 遞迴
void printtreepreorder() const
else
}//遍歷 先序 非遞迴
void printtreepreorder2() const
//遍歷 中序 遞迴
void printtreeinorder() const
else
}void printtreeinorder2() const
else
} //遍歷 後序 遞迴
void printtreepostorder() const
else
}void printtreepostorder2() const
//清空
void makeempty()
//插入遞迴
void insert(const comparable &x)
//插入 非遞迴
void insert2(const comparable &x)
//刪除 遞迴
void remove(const comparable &x)
//樹高 遞迴
int height()const
const binarysearchtree & operator=(const binarysearchtree &rhs)
return *this;
}private:
struct binarynode
};void insert(const comparable &x, binarynode *&t) const //遞迴插入
else if(x < t->element)
else if(t->element < x)
else
}void insert2(const comparable &x, binarynode *&t) const //非遞迴 插入
else
else
}else if(pt->element < x)
else
}else
}} }
void remove(const comparable &x, binarynode *&t) const //遞迴remove
if( x < t->element)
else if(t->element < x)
else if(t->left != null && t->right != null)
else
}binarynode *findmin(binarynode *t) const //遞迴查詢最小值
if(t->left == null)
return findmin(t->left);
} binarynode *findmin2(binarynode *t) const //非遞迴查詢最小值
}return t;
} binarynode *findmax(binarynode *t) const //遞迴查詢最大值
if(t->right == null)
return findmax(t->right);
} binarynode *findmax2(binarynode *t) const //非遞迴查詢最大值
}return t;
} bool contains(const comparable &x, binarynode *t ) const //遞迴判斷是否存在
else if(x < t->element)
else if(t->element < x )
else
}bool contains2(const comparable &x, binarynode *t ) const //非遞迴 判斷是否存在
else if(t->element < x )
else
}return false;
} void makeempty(binarynode *&t)
t = null;
} binarynode *clone(binarynode *t) const //clone 晦澀
return new binarynode(t->element, clone(t->left), clone(t->right));
} int height(binarynode *t) const //樹高
else
}//遞迴遍歷 先序
void printtreepreorder(binarynode *t) const //遞迴遍歷 先序 }
//非遞迴遍歷 先序
void printtreepreorder2(binarynode *t) const
if(!stacknode.empty())
}} //遞迴 遍歷 中序
void printtreeinorder(binarynode *t) const //遞迴遍歷 中序 }
// 非遞迴遍歷 中序
void printtreeinorder2(binarynode *t) const
if(!stacknode.empty())
}} //遞迴 遍歷 後序
void printtreepostorder(binarynode *t) const //遞迴遍歷 後序 }
//非遞迴 遍歷 後序
void printtreepostorder2(binarynode *t) const
while(!s.empty())
else
if(cur->left != null)
}} }
private:
binarynode *root;
};
測試:
#include #include #include "binarysearchtree.h"
using namespace std;
int main()
結果 二叉樹的實現和遍歷
性質1 在二叉樹的第i層上至多有2 i 1 個結點 性質2 深度為k的二叉樹至多有2 k 1個結點 性質3 對任何一棵二叉樹,如果其終端節點數為n0,度為2的結點數為n2,則n0 n2 1 性質4 具有n個節點的完全二叉樹的深度為 logn 1 這裡 表示向下取整。性質5 對一棵有n個節點的完全二叉...
二叉樹的實現和遍歷
性質1 在二叉樹的第i層上至多有2 i 1 個結點 性質2 深度為k的二叉樹至多有2 k 1個結點 性質3 對任何一棵二叉樹,如果其終端節點數為n0,度為2的結點數為n2,則n0 n2 1 性質4 具有n個節點的完全二叉樹的深度為 logn 1 這裡 表示向下取整。性質5 對一棵有n個節點的完全二叉...
二叉樹的遍歷和線索二叉樹
二叉樹的遍歷,所謂二叉樹的遍歷,是指按某條搜尋路徑訪問樹中的每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。由二叉樹的遞迴定義可知,遍歷一棵二叉樹便要決定對根結點n,左子樹l和右子樹r的訪問順序。按照先遍歷再遍歷右子樹的原則,常見的遍歷次序有先,中,後三種遍歷方法,其中序指的是根結點再何時被訪...